@@ -8,7 +8,7 @@ mod status;
88
99use crate :: status:: ExitStatus ;
1010use clap:: { Arg , ArgAction , Command } ;
11- use std:: io:: { ErrorKind , Write } ;
11+ use std:: io:: ErrorKind ;
1212use std:: os:: unix:: process:: ExitStatusExt ;
1313use std:: process:: { self , Child , Stdio } ;
1414use std:: sync:: atomic:: { self , AtomicBool } ;
@@ -20,7 +20,7 @@ use uucore::process::ChildExt;
2020use uucore:: translate;
2121
2222use uucore:: {
23- format_usage,
23+ format_usage, show_error ,
2424 signals:: { signal_by_name_or_value, signal_name_by_value} ,
2525} ;
2626
@@ -208,8 +208,14 @@ fn install_signal_handlers(term_signal: usize) {
208208 let sigpipe_ignored = uucore:: signals:: sigpipe_was_ignored ( ) ;
209209
210210 for sig in [
211- Signal :: SIGALRM , Signal :: SIGINT , Signal :: SIGQUIT , Signal :: SIGHUP ,
212- Signal :: SIGTERM , Signal :: SIGPIPE , Signal :: SIGUSR1 , Signal :: SIGUSR2 ,
211+ Signal :: SIGALRM ,
212+ Signal :: SIGINT ,
213+ Signal :: SIGQUIT ,
214+ Signal :: SIGHUP ,
215+ Signal :: SIGTERM ,
216+ Signal :: SIGPIPE ,
217+ Signal :: SIGUSR1 ,
218+ Signal :: SIGUSR2 ,
213219 ] {
214220 if sig != Signal :: SIGPIPE || !sigpipe_ignored {
215221 let _ = unsafe { nix:: sys:: signal:: signal ( sig, handler) } ;
@@ -224,8 +230,15 @@ fn install_signal_handlers(term_signal: usize) {
224230/// Report that a signal is being sent if the verbose flag is set.
225231fn report_if_verbose ( signal : usize , cmd : & str , verbose : bool ) {
226232 if verbose {
227- let s = if signal == 0 { "0" . to_string ( ) } else { signal_name_by_value ( signal) . unwrap ( ) . to_string ( ) } ;
228- let _ = writeln ! ( std:: io:: stderr( ) , "timeout: sending signal {} to command {}" , s, cmd. quote( ) ) ;
233+ let s = if signal == 0 {
234+ "0" . to_string ( )
235+ } else {
236+ signal_name_by_value ( signal) . unwrap ( ) . to_string ( )
237+ } ;
238+ show_error ! (
239+ "{}" ,
240+ translate!( "timeout-verbose-sending-signal" , "signal" => s, "command" => cmd. quote( ) )
241+ ) ;
229242 }
230243}
231244
@@ -361,6 +374,9 @@ fn timeout(
361374 }
362375 }
363376
377+ install_sigchld ( ) ;
378+ install_signal_handlers ( signal) ;
379+
364380 let process = & mut cmd_builder. spawn ( ) . map_err ( |err| {
365381 let status_code = match err. kind ( ) {
366382 ErrorKind :: NotFound => ExitStatus :: CommandNotFound . into ( ) ,
@@ -372,8 +388,6 @@ fn timeout(
372388 translate ! ( "timeout-error-failed-to-execute-process" , "error" => err) ,
373389 )
374390 } ) ?;
375- install_sigchld ( ) ;
376- install_signal_handlers ( signal) ;
377391
378392 match process. wait_or_timeout ( duration, Some ( & SIGNALED ) ) {
379393 Ok ( Some ( status) ) => Err ( status
@@ -383,15 +397,29 @@ fn timeout(
383397 Ok ( None ) => {
384398 let received_sig = RECEIVED_SIGNAL . load ( atomic:: Ordering :: Relaxed ) ;
385399 let is_external_signal = received_sig > 0 && received_sig != libc:: SIGALRM ;
386- let signal_to_send = if is_external_signal { received_sig as usize } else { signal } ;
400+ let signal_to_send = if is_external_signal {
401+ received_sig as usize
402+ } else {
403+ signal
404+ } ;
387405
388406 report_if_verbose ( signal_to_send, & cmd[ 0 ] , verbose) ;
389407 send_signal ( process, signal_to_send, foreground) ;
390408
391409 if let Some ( kill_after) = kill_after {
392- return match wait_or_kill_process ( process, & cmd[ 0 ] , kill_after, preserve_status, foreground, verbose) {
410+ return match wait_or_kill_process (
411+ process,
412+ & cmd[ 0 ] ,
413+ kill_after,
414+ preserve_status,
415+ foreground,
416+ verbose,
417+ ) {
393418 Ok ( status) => Err ( status. into ( ) ) ,
394- Err ( e) => Err ( USimpleError :: new ( ExitStatus :: TimeoutFailed . into ( ) , e. to_string ( ) ) ) ,
419+ Err ( e) => Err ( USimpleError :: new (
420+ ExitStatus :: TimeoutFailed . into ( ) ,
421+ e. to_string ( ) ,
422+ ) ) ,
395423 } ;
396424 }
397425
@@ -401,8 +429,13 @@ fn timeout(
401429 } else if SIGNALED . load ( atomic:: Ordering :: Relaxed ) {
402430 Err ( ExitStatus :: CommandTimedOut . into ( ) )
403431 } else if preserve_status {
404- Err ( status. code ( )
405- . or_else ( || status. signal ( ) . map ( |s| ExitStatus :: SignalSent ( s as usize ) . into ( ) ) )
432+ Err ( status
433+ . code ( )
434+ . or_else ( || {
435+ status
436+ . signal ( )
437+ . map ( |s| ExitStatus :: SignalSent ( s as usize ) . into ( ) )
438+ } )
406439 . unwrap_or ( ExitStatus :: CommandTimedOut . into ( ) )
407440 . into ( ) )
408441 } else {
0 commit comments