@@ -11,6 +11,7 @@ pub fn signal(signum: int, sig_handler: fn(int), flags: Option<int>) {
1111 signal_internal ( signum, int_sig_handler, flags)
1212}
1313
14+ #[ cfg( target_os = "linux" ) ]
1415fn signal_internal ( signum : int , sig_handler : libc:: size_t , flags : Option < int > ) {
1516 let mut sigset: libc:: sigset_t = unsafe { uninitialized ( ) } ;
1617 let _ = unsafe { libc:: sigemptyset ( & mut sigset as * mut libc:: sigset_t ) } ;
@@ -26,6 +27,21 @@ fn signal_internal(signum: int, sig_handler: libc::size_t, flags: Option<int>) {
2627 unsafe { libc:: sigaction ( signum, & siga as * const libc:: sigaction , & mut oldact as * mut libc:: sigaction ) } ;
2728}
2829
30+ #[ cfg( target_os = "macos" ) ]
31+ fn signal_internal ( signum : int , sig_handler : libc:: size_t , flags : Option < int > ) {
32+ let mut sigset: libc:: sigset_t = unsafe { uninitialized ( ) } ;
33+ let _ = unsafe { libc:: sigemptyset ( & mut sigset as * mut libc:: sigset_t ) } ;
34+
35+ let mut siga = unsafe { uninitialized :: < libc:: sigaction > ( ) } ;
36+ let mut oldact = unsafe { uninitialized :: < libc:: sigaction > ( ) } ;
37+
38+ siga. sa_sigaction = sig_handler;
39+ siga. sa_mask = sigset;
40+ siga. sa_flags = flags. map ( |x| { x - libc:: SA_SIGINFO } ) . unwrap_or ( libc:: SA_ONSTACK | libc:: SA_RESTART ) ;
41+
42+ unsafe { libc:: sigaction ( signum, & siga as * const libc:: sigaction , & mut oldact as * mut libc:: sigaction ) } ;
43+ }
44+
2945pub fn default ( signum : int ) {
3046 let int_sig_handler: libc:: size_t = unsafe { transmute ( libc:: SIG_DFL ) } ;
3147 signal_internal ( signum, int_sig_handler, None )
0 commit comments