1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
use std::io;
use std::os::unix::io::AsRawFd;
use super::error;
use super::signal::Sigset;
use super::Int;
#[derive(Debug)]
pub struct SignalFd {
fd: Int,
}
impl SignalFd {
pub fn new(mask: &Sigset, flags: Int) -> io::Result<SignalFd> {
error::convert_ret(unsafe { libc::signalfd(-1, &mask.raw_set(), flags) })
.map(|fd| SignalFd { fd })
}
pub fn read_one(&self) -> io::Result<Siginfo> {
let mut siginfo: Siginfo = unsafe { std::mem::zeroed() };
error::convert_neg(
unsafe {
libc::read(
self.fd,
(&mut siginfo as *mut Siginfo) as *mut libc::c_void,
std::mem::size_of::<Siginfo>(),
)
},
siginfo,
)
}
pub fn read(&self, siginfos: &mut [Siginfo]) -> io::Result<usize> {
error::convert_neg_ret(unsafe {
libc::read(
self.fd,
siginfos.as_mut_ptr() as *mut libc::c_void,
siginfos.len() * std::mem::size_of::<Siginfo>(),
)
})
.map(|n| (n as usize) / std::mem::size_of::<Siginfo>())
}
}
impl AsRawFd for SignalFd {
fn as_raw_fd(&self) -> libc::c_int {
self.fd
}
}
impl Drop for SignalFd {
fn drop(&mut self) {
unsafe {
libc::close(self.fd);
}
}
}
#[derive(Default, Debug, Copy, Clone)]
#[repr(C)]
pub struct Siginfo {
pub sig: u32,
pub errno: i32,
pub code: i32,
pub pid: u32,
pub uid: u32,
pub fd: i32,
pub tid: u32,
pub band: u32,
pub overrun: u32,
pub trapno: u32,
pub status: i32,
pub int: i32,
pub ptr: u64,
pub utime: u64,
pub stime: u64,
pub addr: u64,
pub addr_lsb: u16,
_padding: [u8; 32],
_padding2: [u8; 14],
}