@@ -315,7 +315,7 @@ impl AsRef<libc::sigset_t> for SigSet {
315
315
}
316
316
317
317
#[ allow( unknown_lints) ]
318
- #[ derive( Clone , Copy , PartialEq ) ]
318
+ #[ derive( Debug , Clone , Copy , PartialEq ) ]
319
319
pub enum SigHandler {
320
320
SigDfl ,
321
321
SigIgn ,
@@ -346,6 +346,24 @@ impl SigAction {
346
346
347
347
SigAction { sigaction : s }
348
348
}
349
+
350
+ pub fn flags ( & self ) -> SaFlags {
351
+ SaFlags :: from_bits ( self . sigaction . sa_flags ) . unwrap ( )
352
+ }
353
+
354
+ pub fn mask ( & self ) -> SigSet {
355
+ SigSet { sigset : self . sigaction . sa_mask }
356
+ }
357
+
358
+ pub fn handler ( & self ) -> SigHandler {
359
+ match self . sigaction . sa_sigaction {
360
+ libc:: SIG_DFL => SigHandler :: SigDfl ,
361
+ libc:: SIG_IGN => SigHandler :: SigIgn ,
362
+ f if self . flags ( ) . contains ( SA_SIGINFO ) =>
363
+ SigHandler :: SigAction ( unsafe { mem:: transmute ( f) } ) ,
364
+ f => SigHandler :: Handler ( unsafe { mem:: transmute ( f) } ) ,
365
+ }
366
+ }
349
367
}
350
368
351
369
pub unsafe fn sigaction ( signal : Signal , sigaction : & SigAction ) -> Result < SigAction > {
@@ -639,6 +657,41 @@ mod tests {
639
657
assert ! ( SigSet :: thread_get_mask( ) . unwrap( ) . contains( SIGUSR2 ) ) ;
640
658
}
641
659
660
+ #[ test]
661
+ fn test_sigaction ( ) {
662
+ use libc;
663
+
664
+ extern fn test_sigaction_handler ( _: libc:: c_int ) { }
665
+ extern fn test_sigaction_action ( _: libc:: c_int ,
666
+ _: * mut libc:: siginfo_t , _: * mut libc:: c_void ) { }
667
+
668
+ let handler_sig = SigHandler :: Handler ( test_sigaction_handler) ;
669
+
670
+ let flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO ;
671
+
672
+ let mut mask = SigSet :: empty ( ) ;
673
+ mask. add ( SIGUSR1 ) ;
674
+
675
+ let action_sig = SigAction :: new ( handler_sig, flags, mask) ;
676
+
677
+ assert_eq ! ( action_sig. flags( ) , SA_ONSTACK | SA_RESTART ) ;
678
+ assert_eq ! ( action_sig. handler( ) , handler_sig) ;
679
+
680
+ mask = action_sig. mask ( ) ;
681
+ assert ! ( mask. contains( SIGUSR1 ) ) ;
682
+ assert ! ( !mask. contains( SIGUSR2 ) ) ;
683
+
684
+ let handler_act = SigHandler :: SigAction ( test_sigaction_action) ;
685
+ let action_act = SigAction :: new ( handler_act, flags, mask) ;
686
+ assert_eq ! ( action_act. handler( ) , handler_act) ;
687
+
688
+ let action_dfl = SigAction :: new ( SigHandler :: SigDfl , flags, mask) ;
689
+ assert_eq ! ( action_dfl. handler( ) , SigHandler :: SigDfl ) ;
690
+
691
+ let action_ign = SigAction :: new ( SigHandler :: SigIgn , flags, mask) ;
692
+ assert_eq ! ( action_ign. handler( ) , SigHandler :: SigIgn ) ;
693
+ }
694
+
642
695
// TODO(#251): Re-enable after figuring out flakiness.
643
696
#[ cfg( not( any( target_os = "macos" , target_os = "ios" ) ) ) ]
644
697
#[ test]
0 commit comments