@@ -701,9 +701,24 @@ impl EnvAppData {
701701 #[ cfg( unix) ]
702702 {
703703 let mut signal_action_log = SignalActionLog :: default ( ) ;
704- apply_default_signal ( & opts. default_signal , & mut signal_action_log) ?;
705- apply_ignore_signal ( & opts. ignore_signal , & mut signal_action_log) ?;
706- apply_block_signal ( & opts. block_signal , & mut signal_action_log) ?;
704+ apply_signal_action (
705+ & opts. default_signal ,
706+ & mut signal_action_log,
707+ SignalActionKind :: Default ,
708+ reset_signal,
709+ ) ?;
710+ apply_signal_action (
711+ & opts. ignore_signal ,
712+ & mut signal_action_log,
713+ SignalActionKind :: Ignore ,
714+ ignore_signal,
715+ ) ?;
716+ apply_signal_action (
717+ & opts. block_signal ,
718+ & mut signal_action_log,
719+ SignalActionKind :: Block ,
720+ block_signal,
721+ ) ?;
707722 if opts. list_signal_handling {
708723 list_signal_handling ( & signal_action_log) ;
709724 }
@@ -990,19 +1005,29 @@ fn apply_specified_env_vars(opts: &Options<'_>) {
9901005}
9911006
9921007#[ cfg( unix) ]
993- fn apply_default_signal ( request : & SignalRequest , log : & mut SignalActionLog ) -> UResult < ( ) > {
1008+ fn apply_signal_action < F > (
1009+ request : & SignalRequest ,
1010+ log : & mut SignalActionLog ,
1011+ action_kind : SignalActionKind ,
1012+ signal_fn : F ,
1013+ ) -> UResult < ( ) >
1014+ where
1015+ F : Fn ( Signal ) -> UResult < ( ) > ,
1016+ {
9941017 request. for_each_signal ( |sig_value, explicit| {
9951018 // On some platforms ALL_SIGNALS may contain values that are not valid in libc.
9961019 // Skip those invalid ones and continue (GNU env also ignores undefined signals).
9971020 let Ok ( sig) = signal_from_value ( sig_value) else {
9981021 return Ok ( ( ) ) ;
9991022 } ;
1000- reset_signal ( sig) ?;
1001- log. record ( sig_value, SignalActionKind :: Default , explicit) ;
1023+ signal_fn ( sig) ?;
1024+ log. record ( sig_value, action_kind , explicit) ;
10021025
10031026 // Set environment variable to communicate to Rust child processes
10041027 // that SIGPIPE should be default (not ignored)
1005- if sig_value == nix:: libc:: SIGPIPE as usize {
1028+ if matches ! ( action_kind, SignalActionKind :: Default )
1029+ && sig_value == nix:: libc:: SIGPIPE as usize
1030+ {
10061031 unsafe {
10071032 std:: env:: set_var ( "RUST_SIGPIPE" , "default" ) ;
10081033 }
@@ -1012,30 +1037,6 @@ fn apply_default_signal(request: &SignalRequest, log: &mut SignalActionLog) -> U
10121037 } )
10131038}
10141039
1015- #[ cfg( unix) ]
1016- fn apply_ignore_signal ( request : & SignalRequest , log : & mut SignalActionLog ) -> UResult < ( ) > {
1017- request. for_each_signal ( |sig_value, explicit| {
1018- let Ok ( sig) = signal_from_value ( sig_value) else {
1019- return Ok ( ( ) ) ;
1020- } ;
1021- ignore_signal ( sig) ?;
1022- log. record ( sig_value, SignalActionKind :: Ignore , explicit) ;
1023- Ok ( ( ) )
1024- } )
1025- }
1026-
1027- #[ cfg( unix) ]
1028- fn apply_block_signal ( request : & SignalRequest , log : & mut SignalActionLog ) -> UResult < ( ) > {
1029- request. for_each_signal ( |sig_value, explicit| {
1030- let Ok ( sig) = signal_from_value ( sig_value) else {
1031- return Ok ( ( ) ) ;
1032- } ;
1033- block_signal ( sig) ?;
1034- log. record ( sig_value, SignalActionKind :: Block , explicit) ;
1035- Ok ( ( ) )
1036- } )
1037- }
1038-
10391040#[ cfg( unix) ]
10401041fn ignore_signal ( sig : Signal ) -> UResult < ( ) > {
10411042 // SAFETY: This is safe because we write the handler for each signal only once, and therefore "the current handler is the default", as the documentation requires it.
0 commit comments