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}