@@ -35,13 +35,7 @@ pub(in crate::exec) fn exec_pty(
3535 // Allocate a pseudoterminal.
3636 let pty = get_pty ( pty_owner) ?;
3737
38- let mut original_signals = match SignalsState :: save ( ) {
39- Ok ( original_signals) => Some ( original_signals) ,
40- Err ( err) => {
41- dev_warn ! ( "cannot save state original signals: {err}" ) ;
42- None
43- }
44- } ;
38+ let mut original_signals = SignalsState :: save ( ) ?;
4539
4640 // Create backchannels to communicate with the monitor.
4741 let mut backchannels = BackchannelPair :: new ( ) . map_err ( |err| {
@@ -256,7 +250,7 @@ pub(in crate::exec) fn exec_pty(
256250 term_raw,
257251 preserve_oflag,
258252 & mut registry,
259- & mut original_signals,
253+ original_signals,
260254 ) ?;
261255
262256 // Restore the signal mask now that the handlers have been setup.
@@ -327,6 +321,7 @@ struct ParentClosure {
327321 backchannel : ParentBackchannel ,
328322 message_queue : VecDeque < MonitorMessage > ,
329323 backchannel_write_handle : EventHandle ,
324+ original_signals : SignalsState ,
330325 signal_stream : & ' static SignalStream ,
331326 signal_handlers : [ SignalHandler ; ParentClosure :: SIGNALS . len ( ) ] ,
332327}
@@ -349,7 +344,7 @@ impl ParentClosure {
349344 term_raw : bool ,
350345 preserve_oflag : bool ,
351346 registry : & mut EventRegistry < Self > ,
352- original_signals : & mut Option < SignalsState > ,
347+ mut original_signals : SignalsState ,
353348 ) -> io:: Result < Self > {
354349 // Enable nonblocking assertions as we will poll this inside the event loop.
355350 backchannel. set_nonblocking_asserts ( true ) ;
@@ -365,7 +360,7 @@ impl ParentClosure {
365360
366361 registry. register_event ( signal_stream, PollEvent :: Readable , |_| ParentEvent :: Signal ) ;
367362
368- let signal_handlers = register_handlers ( Self :: SIGNALS , original_signals) ?;
363+ let signal_handlers = register_handlers ( Self :: SIGNALS , & mut original_signals) ?;
369364
370365 Ok ( Self {
371366 monitor_pid : Some ( monitor_pid) ,
@@ -380,6 +375,7 @@ impl ParentClosure {
380375 backchannel,
381376 message_queue : VecDeque :: new ( ) ,
382377 backchannel_write_handle,
378+ original_signals,
383379 signal_stream,
384380 signal_handlers,
385381 } )
@@ -540,10 +536,13 @@ impl ParentClosure {
540536 registry : & mut EventRegistry < Self > ,
541537 ) -> Option < SignalNumber > {
542538 // Ignore `SIGCONT` while suspending to avoid resuming the terminal twice.
543- let sigcont_handler =
544- SignalHandler :: register_untracked ( SIGCONT , SignalHandlerBehavior :: Ignore )
545- . map_err ( |err| dev_warn ! ( "cannot set handler for SIGCONT: {err}" ) )
546- . ok ( ) ;
539+ let sigcont_handler = SignalHandler :: register (
540+ SIGCONT ,
541+ SignalHandlerBehavior :: Ignore ,
542+ & mut self . original_signals ,
543+ )
544+ . map_err ( |err| dev_warn ! ( "cannot set handler for SIGCONT: {err}" ) )
545+ . ok ( ) ;
547546
548547 if let SIGTTOU | SIGTTIN = signal {
549548 // If sudo is already the foreground process we can resume the command in the
@@ -584,9 +583,13 @@ impl ParentClosure {
584583 }
585584
586585 let signal_handler = if signal != SIGSTOP {
587- SignalHandler :: register_untracked ( signal, SignalHandlerBehavior :: Default )
588- . map_err ( |err| dev_warn ! ( "cannot set handler for {}: {err}" , signal_fmt( signal) ) )
589- . ok ( )
586+ SignalHandler :: register (
587+ signal,
588+ SignalHandlerBehavior :: Default ,
589+ & mut self . original_signals ,
590+ )
591+ . map_err ( |err| dev_warn ! ( "cannot set handler for {}: {err}" , signal_fmt( signal) ) )
592+ . ok ( )
590593 } else {
591594 None
592595 } ;
0 commit comments