diff --git a/src/uu/arch/src/arch.rs b/src/uu/arch/src/arch.rs index 7454f09fff1..f07eb227c41 100644 --- a/src/uu/arch/src/arch.rs +++ b/src/uu/arch/src/arch.rs @@ -9,7 +9,7 @@ use std::io::{Write, stdout}; use uucore::error::{UResult, USimpleError}; use uucore::translate; -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { uucore::clap_localization::handle_clap_result(uu_app(), args)?; diff --git a/src/uu/basename/src/basename.rs b/src/uu/basename/src/basename.rs index cf89346a212..3ec5cb7c5b3 100644 --- a/src/uu/basename/src/basename.rs +++ b/src/uu/basename/src/basename.rs @@ -24,7 +24,7 @@ pub mod options { pub static ZERO: &str = "zero"; } -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { // // Argument parsing diff --git a/src/uu/dircolors/src/dircolors.rs b/src/uu/dircolors/src/dircolors.rs index 762a972539d..a3f3c0377f7 100644 --- a/src/uu/dircolors/src/dircolors.rs +++ b/src/uu/dircolors/src/dircolors.rs @@ -116,7 +116,7 @@ fn generate_ls_colors(fmt: &OutputFmt, sep: &str) -> String { } } -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result(uu_app(), args)?; diff --git a/src/uu/dirname/src/dirname.rs b/src/uu/dirname/src/dirname.rs index 6bd91d91054..09bf9928a3a 100644 --- a/src/uu/dirname/src/dirname.rs +++ b/src/uu/dirname/src/dirname.rs @@ -99,7 +99,7 @@ fn dirname_string_manipulation(path_bytes: &[u8]) -> Cow<'_, [u8]> { Cow::Borrowed(b".") } -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result(uu_app(), args)?; diff --git a/src/uu/expr/src/expr.rs b/src/uu/expr/src/expr.rs index caaa9eec9b1..f2bec49e8d7 100644 --- a/src/uu/expr/src/expr.rs +++ b/src/uu/expr/src/expr.rs @@ -99,7 +99,7 @@ pub fn uu_app() -> Command { ) } -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { // For expr utility we do not want getopts. // The following usage should work without escaping hyphens: `expr -15 = 1 + 2 \* \( 3 - -4 \)` diff --git a/src/uu/false/src/false.rs b/src/uu/false/src/false.rs index b0ade6957bc..097e01de3b6 100644 --- a/src/uu/false/src/false.rs +++ b/src/uu/false/src/false.rs @@ -8,7 +8,7 @@ use uucore::error::{UResult, set_exit_code}; use uucore::translate; -#[uucore::main] +#[uucore::main(no_signals)] // TODO: modify proc macro to allow no-result uumain #[expect(clippy::unnecessary_wraps, reason = "proc macro requires UResult")] pub fn uumain(args: impl uucore::Args) -> UResult<()> { diff --git a/src/uu/groups/src/groups.rs b/src/uu/groups/src/groups.rs index aff29ca1e12..eed278ed7f4 100644 --- a/src/uu/groups/src/groups.rs +++ b/src/uu/groups/src/groups.rs @@ -45,7 +45,7 @@ fn infallible_gid2grp(gid: u32) -> String { } } -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result(uu_app(), args)?; diff --git a/src/uu/hostid/src/hostid.rs b/src/uu/hostid/src/hostid.rs index 52981313544..041dc232344 100644 --- a/src/uu/hostid/src/hostid.rs +++ b/src/uu/hostid/src/hostid.rs @@ -12,7 +12,7 @@ use uucore::{error::UResult, format_usage}; use uucore::translate; -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { uucore::clap_localization::handle_clap_result(uu_app(), args)?; /* diff --git a/src/uu/hostname/src/hostname.rs b/src/uu/hostname/src/hostname.rs index 0bff9578cb4..70c20e780f3 100644 --- a/src/uu/hostname/src/hostname.rs +++ b/src/uu/hostname/src/hostname.rs @@ -59,7 +59,7 @@ mod wsa { } } -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result(uu_app(), args)?; diff --git a/src/uu/id/src/id.rs b/src/uu/id/src/id.rs index d15101a46a4..3ff281baa03 100644 --- a/src/uu/id/src/id.rs +++ b/src/uu/id/src/id.rs @@ -121,7 +121,7 @@ struct State { user_specified: bool, } -#[uucore::main] +#[uucore::main(no_signals)] #[allow(clippy::cognitive_complexity)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result(uu_app(), args)?; diff --git a/src/uu/link/src/link.rs b/src/uu/link/src/link.rs index d19e84be498..12ebbbee916 100644 --- a/src/uu/link/src/link.rs +++ b/src/uu/link/src/link.rs @@ -17,7 +17,7 @@ pub mod options { pub static FILES: &str = "FILES"; } -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result(uu_app(), args)?; let files: Vec<_> = matches diff --git a/src/uu/logname/src/logname.rs b/src/uu/logname/src/logname.rs index de211bc89e7..32b0c85105c 100644 --- a/src/uu/logname/src/logname.rs +++ b/src/uu/logname/src/logname.rs @@ -22,7 +22,7 @@ fn get_userlogin() -> Option { } } -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let _ = uucore::clap_localization::handle_clap_result(uu_app(), args)?; diff --git a/src/uu/nproc/src/nproc.rs b/src/uu/nproc/src/nproc.rs index a400440fb7a..452a381d174 100644 --- a/src/uu/nproc/src/nproc.rs +++ b/src/uu/nproc/src/nproc.rs @@ -25,7 +25,7 @@ pub const _SC_NPROCESSORS_CONF: libc::c_int = 1001; static OPT_ALL: &str = "all"; static OPT_IGNORE: &str = "ignore"; -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result(uu_app(), args)?; diff --git a/src/uu/pathchk/src/pathchk.rs b/src/uu/pathchk/src/pathchk.rs index d0a35c33160..8ba3f4d37ac 100644 --- a/src/uu/pathchk/src/pathchk.rs +++ b/src/uu/pathchk/src/pathchk.rs @@ -33,7 +33,7 @@ mod options { const POSIX_PATH_MAX: usize = 256; const POSIX_NAME_MAX: usize = 14; -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result(uu_app(), args)?; diff --git a/src/uu/pinky/src/pinky.rs b/src/uu/pinky/src/pinky.rs index 17be02c459a..3ae07370a63 100644 --- a/src/uu/pinky/src/pinky.rs +++ b/src/uu/pinky/src/pinky.rs @@ -26,7 +26,7 @@ mod options { pub const HELP: &str = "help"; } -#[uucore::main] +#[uucore::main(no_signals)] use platform::uumain; pub fn uu_app() -> Command { diff --git a/src/uu/printenv/src/printenv.rs b/src/uu/printenv/src/printenv.rs index bfdf6934cd7..e9f09f1d6e1 100644 --- a/src/uu/printenv/src/printenv.rs +++ b/src/uu/printenv/src/printenv.rs @@ -17,7 +17,7 @@ static OPT_NULL: &str = "null"; static ARG_VARIABLES: &str = "variables"; -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result_with_exit_code(uu_app(), args, 2)?; diff --git a/src/uu/pwd/src/pwd.rs b/src/uu/pwd/src/pwd.rs index cefdee8986f..b1670b06d0a 100644 --- a/src/uu/pwd/src/pwd.rs +++ b/src/uu/pwd/src/pwd.rs @@ -107,7 +107,7 @@ fn logical_path() -> io::Result { } } -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result(uu_app(), args)?; // if POSIXLY_CORRECT is set, we want to a logical resolution. diff --git a/src/uu/readlink/src/readlink.rs b/src/uu/readlink/src/readlink.rs index 43fe7a15d64..4fc8eaa0e9c 100644 --- a/src/uu/readlink/src/readlink.rs +++ b/src/uu/readlink/src/readlink.rs @@ -30,7 +30,7 @@ const OPT_ZERO: &str = "zero"; const ARG_FILES: &str = "files"; -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result(uu_app(), args)?; diff --git a/src/uu/realpath/src/realpath.rs b/src/uu/realpath/src/realpath.rs index 43bfa78adbb..860e1361ec8 100644 --- a/src/uu/realpath/src/realpath.rs +++ b/src/uu/realpath/src/realpath.rs @@ -71,7 +71,7 @@ impl ValueParserFactory for NonEmptyOsStringParser { } } -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result(uu_app(), args)?; diff --git a/src/uu/test/src/test.rs b/src/uu/test/src/test.rs index c1766f5481e..92b1dcdde02 100644 --- a/src/uu/test/src/test.rs +++ b/src/uu/test/src/test.rs @@ -41,7 +41,7 @@ pub fn uu_app() -> Command { .after_help(translate!("test-after-help")) } -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(mut args: impl uucore::Args) -> UResult<()> { let program = args.next().unwrap_or_else(|| OsString::from("test")); let binary_name = uucore::util_name(); diff --git a/src/uu/true/src/true.rs b/src/uu/true/src/true.rs index fe8c762e0ec..7a4da181026 100644 --- a/src/uu/true/src/true.rs +++ b/src/uu/true/src/true.rs @@ -8,7 +8,7 @@ use uucore::error::{UResult, set_exit_code}; use uucore::translate; -#[uucore::main] +#[uucore::main(no_signals)] // TODO: modify proc macro to allow no-result uumain #[expect(clippy::unnecessary_wraps, reason = "proc macro requires UResult")] pub fn uumain(args: impl uucore::Args) -> UResult<()> { diff --git a/src/uu/tty/src/tty.rs b/src/uu/tty/src/tty.rs index 0e9aa77b2d4..cb5ae8e1721 100644 --- a/src/uu/tty/src/tty.rs +++ b/src/uu/tty/src/tty.rs @@ -17,7 +17,7 @@ mod options { pub const SILENT: &str = "silent"; } -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result_with_exit_code(uu_app(), args, 2)?; diff --git a/src/uu/uname/src/uname.rs b/src/uu/uname/src/uname.rs index a6658207201..f83ef0d12b3 100644 --- a/src/uu/uname/src/uname.rs +++ b/src/uu/uname/src/uname.rs @@ -119,7 +119,7 @@ pub struct Options { pub os: bool, } -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result(uu_app(), args)?; diff --git a/src/uu/unlink/src/unlink.rs b/src/uu/unlink/src/unlink.rs index 0e03c3cd1ce..caea413da51 100644 --- a/src/uu/unlink/src/unlink.rs +++ b/src/uu/unlink/src/unlink.rs @@ -16,7 +16,7 @@ use uucore::translate; static OPT_PATH: &str = "FILE"; -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result(uu_app(), args)?; diff --git a/src/uu/uptime/src/uptime.rs b/src/uu/uptime/src/uptime.rs index e764e403bf8..c9cdd3f5ae5 100644 --- a/src/uu/uptime/src/uptime.rs +++ b/src/uu/uptime/src/uptime.rs @@ -48,7 +48,7 @@ impl UError for UptimeError { } } -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result(uu_app(), args)?; diff --git a/src/uu/users/src/users.rs b/src/uu/users/src/users.rs index 2a14ca3bf25..ea4b63d0d2a 100644 --- a/src/uu/users/src/users.rs +++ b/src/uu/users/src/users.rs @@ -34,7 +34,7 @@ fn get_long_usage() -> String { translate!("users-long-usage", "default_path" => default_path) } -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result(uu_app(), args)?; diff --git a/src/uu/who/src/who.rs b/src/uu/who/src/who.rs index 49b67e47d03..197fbe71287 100644 --- a/src/uu/who/src/who.rs +++ b/src/uu/who/src/who.rs @@ -36,7 +36,7 @@ fn get_runlevel_help() -> String { return translate!("who-help-runlevel-non-linux"); } -#[uucore::main] +#[uucore::main(no_signals)] use platform::uumain; pub fn uu_app() -> Command { diff --git a/src/uu/whoami/src/whoami.rs b/src/uu/whoami/src/whoami.rs index 2e4727e3164..3851c10748d 100644 --- a/src/uu/whoami/src/whoami.rs +++ b/src/uu/whoami/src/whoami.rs @@ -11,7 +11,7 @@ use uucore::translate; mod platform; -#[uucore::main] +#[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { uucore::clap_localization::handle_clap_result(uu_app(), args)?; let username = whoami()?; diff --git a/src/uucore_procs/src/lib.rs b/src/uucore_procs/src/lib.rs index c73f542a98b..391db32907e 100644 --- a/src/uucore_procs/src/lib.rs +++ b/src/uucore_procs/src/lib.rs @@ -23,14 +23,16 @@ use quote::quote; /// - Disabling Rust signal handlers for proper core dumps /// - Error handling and exit code management #[proc_macro_attribute] -pub fn main(_args: TokenStream, stream: TokenStream) -> TokenStream { +pub fn main(args: TokenStream, stream: TokenStream) -> TokenStream { let stream = proc_macro2::TokenStream::from(stream); + // Some utils e.g. true does not require signals + let signals = !args.to_string().contains("no_signals"); let new = quote!( // Initialize SIGPIPE state capture at process startup (Unix only). // This must be at module level to set up the .init_array static that runs // before main() to capture whether SIGPIPE was ignored by the parent process. - #[cfg(unix)] + #[cfg(all(#signals, unix))] uucore::init_startup_state_capture!(); pub fn uumain(args: impl uucore::Args) -> i32 { @@ -39,13 +41,14 @@ pub fn main(_args: TokenStream, stream: TokenStream) -> TokenStream { // Restore SIGPIPE to default if it wasn't explicitly ignored by parent. // The Rust runtime ignores SIGPIPE, but we need to respect the parent's // signal disposition for proper pipeline behavior (GNU compatibility). + // needed even for true --version #[cfg(unix)] if !uucore::signals::sigpipe_was_ignored() { let _ = uucore::signals::enable_pipe_errors(); } // disable rust signal handlers (otherwise processes don't dump core after e.g. one SIGSEGV) - #[cfg(unix)] + #[cfg(all(#signals, unix))] uucore::disable_rust_signal_handlers().expect("Disabling rust signal handlers failed"); let result = uumain(args); match result {