@@ -19,9 +19,6 @@ use uucore::parser::parse_time;
1919use uucore:: process:: ChildExt ;
2020use uucore:: translate;
2121
22- #[ cfg( unix) ]
23- use uucore:: signals:: enable_pipe_errors;
24-
2522use uucore:: {
2623 format_usage, show_error,
2724 signals:: { signal_by_name_or_value, signal_name_by_value} ,
@@ -105,8 +102,16 @@ impl Config {
105102 }
106103}
107104
105+ #[ cfg( unix) ]
106+ uucore:: init_sigpipe_capture!( ) ;
107+
108108#[ uucore:: main]
109109pub fn uumain ( args : impl uucore:: Args ) -> UResult < ( ) > {
110+ #[ cfg( unix) ]
111+ if !uucore:: signals:: sigpipe_was_ignored ( ) {
112+ uucore:: signals:: enable_pipe_errors ( ) ?;
113+ }
114+
110115 let matches =
111116 uucore:: clap_localization:: handle_clap_result_with_exit_code ( uu_app ( ) , args, 125 ) ?;
112117
@@ -320,26 +325,28 @@ fn timeout(
320325 if !foreground {
321326 let _ = setpgid ( Pid :: from_raw ( 0 ) , Pid :: from_raw ( 0 ) ) ;
322327 }
323- #[ cfg( unix) ]
324- enable_pipe_errors ( ) ?;
325328
326- let process = & mut process:: Command :: new ( & cmd[ 0 ] )
329+ let mut cmd_builder = process:: Command :: new ( & cmd[ 0 ] ) ;
330+ cmd_builder
327331 . args ( & cmd[ 1 ..] )
328332 . stdin ( Stdio :: inherit ( ) )
329333 . stdout ( Stdio :: inherit ( ) )
330- . stderr ( Stdio :: inherit ( ) )
331- . spawn ( )
332- . map_err ( |err| {
333- let status_code = match err. kind ( ) {
334- ErrorKind :: NotFound => ExitStatus :: CommandNotFound . into ( ) ,
335- ErrorKind :: PermissionDenied => ExitStatus :: CannotInvoke . into ( ) ,
336- _ => ExitStatus :: CannotInvoke . into ( ) ,
337- } ;
338- USimpleError :: new (
339- status_code,
340- translate ! ( "timeout-error-failed-to-execute-process" , "error" => err) ,
341- )
342- } ) ?;
334+ . stderr ( Stdio :: inherit ( ) ) ;
335+
336+ #[ cfg( unix) ]
337+ uucore:: signals:: preserve_sigpipe_for_child ( & mut cmd_builder) ;
338+
339+ let process = & mut cmd_builder. spawn ( ) . map_err ( |err| {
340+ let status_code = match err. kind ( ) {
341+ ErrorKind :: NotFound => ExitStatus :: CommandNotFound . into ( ) ,
342+ ErrorKind :: PermissionDenied => ExitStatus :: CannotInvoke . into ( ) ,
343+ _ => ExitStatus :: CannotInvoke . into ( ) ,
344+ } ;
345+ USimpleError :: new (
346+ status_code,
347+ translate ! ( "timeout-error-failed-to-execute-process" , "error" => err) ,
348+ )
349+ } ) ?;
343350 unblock_sigchld ( ) ;
344351 catch_sigterm ( ) ;
345352 // Wait for the child process for the specified time period.
0 commit comments