15
15
//!
16
16
//! Please note that signal discarding is not specific to `signalfd`, but also happens with regular
17
17
//! signal handlers.
18
- use libc:: { c_int , pid_t , uid_t } ;
18
+ use libc;
19
19
use unistd;
20
- use { Errno , Result } ;
21
- use sys:: signal:: signal:: siginfo as signal_siginfo;
20
+ use { Error , Errno , Result } ;
22
21
pub use sys:: signal:: { self , SigSet } ;
22
+ pub use libc:: signalfd_siginfo as siginfo;
23
23
24
24
use std:: os:: unix:: io:: { RawFd , AsRawFd } ;
25
25
use std:: mem;
26
26
27
- mod ffi {
28
- use libc:: c_int;
29
- use sys:: signal:: sigset_t;
30
-
31
- extern {
32
- pub fn signalfd ( fd : c_int , mask : * const sigset_t , flags : c_int ) -> c_int ;
33
- }
34
- }
35
27
36
28
bitflags ! {
37
- flags SfdFlags : c_int {
38
- const SFD_NONBLOCK = 0o00004000 , // O_NONBLOCK
39
- const SFD_CLOEXEC = 0o02000000 , // O_CLOEXEC
29
+ flags SfdFlags : libc :: c_int {
30
+ const SFD_NONBLOCK = libc :: SFD_NONBLOCK ,
31
+ const SFD_CLOEXEC = libc :: SFD_CLOEXEC ,
40
32
}
41
33
}
42
34
43
- pub const CREATE_NEW_FD : RawFd = -1 ;
35
+ pub const SIGNALFD_NEW : RawFd = -1 ;
36
+ pub const SIGNALFD_SIGINFO_SIZE : usize = 128 ;
44
37
45
38
/// Creates a new file descriptor for reading signals.
46
39
///
@@ -55,7 +48,7 @@ pub const CREATE_NEW_FD: RawFd = -1;
55
48
/// See [the signalfd man page for more information](http://man7.org/linux/man-pages/man2/signalfd.2.html)
56
49
pub fn signalfd ( fd : RawFd , mask : & SigSet , flags : SfdFlags ) -> Result < RawFd > {
57
50
unsafe {
58
- Errno :: result ( ffi :: signalfd ( fd as c_int , mask. as_ref ( ) , flags. bits ( ) ) )
51
+ Errno :: result ( libc :: signalfd ( fd as libc :: c_int , mask. as_ref ( ) , flags. bits ( ) ) )
59
52
}
60
53
}
61
54
@@ -98,7 +91,7 @@ impl SignalFd {
98
91
}
99
92
100
93
pub fn with_flags ( mask : & SigSet , flags : SfdFlags ) -> Result < SignalFd > {
101
- let fd = try!( signalfd ( CREATE_NEW_FD , mask, flags) ) ;
94
+ let fd = try!( signalfd ( SIGNALFD_NEW , mask, flags) ) ;
102
95
103
96
Ok ( SignalFd ( fd) )
104
97
}
@@ -108,10 +101,10 @@ impl SignalFd {
108
101
}
109
102
110
103
pub fn read_signal ( & mut self ) -> Result < Option < siginfo > > {
111
- let mut buffer: [ u8 ; SIGINFO_SIZE ] = unsafe { mem:: uninitialized ( ) } ;
104
+ let mut buffer: [ u8 ; SIGNALFD_SIGINFO_SIZE ] = unsafe { mem:: uninitialized ( ) } ;
112
105
113
106
match unistd:: read ( self . 0 , & mut buffer) {
114
- Ok ( SIGINFO_SIZE ) => Ok ( Some ( unsafe { mem:: transmute_copy ( & buffer) } ) ) ,
107
+ Ok ( SIGNALFD_SIGINFO_SIZE ) => Ok ( Some ( unsafe { mem:: transmute ( buffer) } ) ) ,
115
108
Ok ( _) => unreachable ! ( "partial read on signalfd" ) ,
116
109
Err ( Error :: Sys ( Errno :: EAGAIN ) ) => Ok ( None ) ,
117
110
Err ( error) => Err ( error)
@@ -143,51 +136,17 @@ impl Iterator for SignalFd {
143
136
}
144
137
}
145
138
146
- pub const SIGINFO_SIZE : usize = 128 ;
147
- pub const SIGINFO_PADDING : usize = 48 ;
148
-
149
- #[ derive( Debug , Clone , PartialEq ) ]
150
- #[ repr( C , packed) ]
151
- pub struct siginfo {
152
- pub ssi_signo : u32 ,
153
- pub ssi_errno : i32 ,
154
- pub ssi_code : i32 ,
155
- pub ssi_pid : u32 ,
156
- pub ssi_uid : u32 ,
157
- pub ssi_fd : i32 ,
158
- pub ssi_tid : u32 ,
159
- pub ssi_band : u32 ,
160
- pub ssi_overrun : u32 ,
161
- pub ssi_trapno : u32 ,
162
- pub ssi_status : i32 ,
163
- pub ssi_int : i32 ,
164
- pub ssi_ptr : u64 ,
165
- pub ssi_utime : u64 ,
166
- pub ssi_stime : u64 ,
167
- pub ssi_addr : u64 ,
168
- }
169
-
170
- impl Into < signal_siginfo > for siginfo {
171
- fn into ( self ) -> signal_siginfo {
172
- signal_siginfo {
173
- si_signo : self . ssi_signo as c_int ,
174
- si_errno : self . ssi_errno as c_int ,
175
- si_code : self . ssi_code as c_int ,
176
- pid : self . ssi_pid as pid_t ,
177
- uid : self . ssi_uid as uid_t ,
178
- status : self . ssi_status as c_int ,
179
- }
180
- }
181
- }
182
139
183
140
#[ cfg( test) ]
184
141
mod tests {
185
142
use super :: * ;
186
143
use std:: mem;
144
+ use libc;
145
+
187
146
188
147
#[ test]
189
148
fn check_siginfo_size ( ) {
190
- assert_eq ! ( mem:: size_of:: <siginfo >( ) + SIGINFO_PADDING , SIGINFO_SIZE ) ;
149
+ assert_eq ! ( mem:: size_of:: <libc :: signalfd_siginfo >( ) , SIGNALFD_SIGINFO_SIZE ) ;
191
150
}
192
151
193
152
#[ test]
@@ -210,6 +169,6 @@ mod tests {
210
169
let mut fd = SignalFd :: with_flags ( & mask, SFD_NONBLOCK ) . unwrap ( ) ;
211
170
212
171
let res = fd. read_signal ( ) ;
213
- assert_eq ! ( res, Ok ( None ) ) ;
172
+ assert ! ( res. unwrap ( ) . is_none ( ) ) ;
214
173
}
215
174
}
0 commit comments