lx/syscalls/
signalfd.rs

1use core::mem;
2
3use super::abi::*;
4use crate::{
5    result_from_value,
6    sigset_t,
7    OwnedFd,
8};
9
10pub const SFD_NONBLOCK: i32 = 0x800;
11pub const SFD_CLOEXEC: i32 = 0x80000;
12
13#[allow(non_camel_case_types)]
14#[repr(C)]
15pub struct signalfd_siginfo {
16    pub ssi_signo: u32,
17    pub ssi_errno: i32,
18    pub ssi_code: i32,
19    pub ssi_pid: u32,
20    pub ssi_uid: u32,
21    pub ssi_fd: i32,
22    pub ssi_tid: u32,
23    pub ssi_band: u32,
24    pub ssi_overrun: u32,
25    pub ssi_trapno: u32,
26    pub ssi_status: i32,
27    pub ssi_int: i32,
28    pub ssi_ptr: u64,
29    pub ssi_utime: u64,
30    pub ssi_stime: u64,
31    pub ssi_addr: u64,
32    pub ssi_addr_lsb: u16,
33    zero: u16,
34    pub ssi_syscall: i32,
35    pub ssi_call_addr: u64,
36    pub ssi_arch: u32,
37    zero2: [u8; 28],
38}
39
40#[inline]
41pub fn signalfd4(fd: i32, mask: &sigset_t, flags: i32) -> crate::Result<OwnedFd> {
42    let ret = unsafe {
43        syscall_4(
44            289,
45            fd as usize,
46            mask as *const sigset_t as usize,
47            mem::size_of_val(mask),
48            flags as usize,
49        ) as i32
50    };
51    result_from_value(ret).map(OwnedFd::new)
52}