From ac7b953e7757054afe1957c9bd21d9e0b530f943 Mon Sep 17 00:00:00 2001 From: dcarrier Date: Tue, 23 Apr 2024 12:44:12 -0700 Subject: [PATCH 1/4] kill: convert SIGEXT (0) to Option::None so nix takes correct action tests/kill: test handling SIGEXIT kill: pass unqualified None for consistency --- src/uu/kill/src/kill.rs | 17 ++++++++++++----- tests/by-util/test_kill.rs | 10 ++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/uu/kill/src/kill.rs b/src/uu/kill/src/kill.rs index 632055b800..fc52f0317d 100644 --- a/src/uu/kill/src/kill.rs +++ b/src/uu/kill/src/kill.rs @@ -11,7 +11,7 @@ use nix::unistd::Pid; use std::io::Error; use uucore::display::Quotable; use uucore::error::{FromIo, UResult, USimpleError}; -use uucore::signals::{signal_by_name_or_value, ALL_SIGNALS}; +use uucore::signals::{signal_by_name_or_value, signal_name_by_value, ALL_SIGNALS}; use uucore::{format_usage, help_about, help_usage, show}; static ABOUT: &str = help_about!("kill.md"); @@ -60,9 +60,16 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } else { 15_usize //SIGTERM }; - let sig: Signal = (sig as i32) - .try_into() - .map_err(|e| std::io::Error::from_raw_os_error(e as i32))?; + let sig_name = signal_name_by_value(sig); + let sig: Option = if sig_name.is_some_and(|name| name == "EXIT") { + None + } else { + let sig = (sig as i32) + .try_into() + .map_err(|e| std::io::Error::from_raw_os_error(e as i32))?; + Some(sig) + }; + let pids = parse_pids(&pids_or_signals)?; if pids.is_empty() { Err(USimpleError::new( @@ -211,7 +218,7 @@ fn parse_pids(pids: &[String]) -> UResult> { .collect() } -fn kill(sig: Signal, pids: &[i32]) { +fn kill(sig: Option, pids: &[i32]) { for &pid in pids { if let Err(e) = signal::kill(Pid::from_raw(pid), sig) { show!(Error::from_raw_os_error(e as i32) diff --git a/tests/by-util/test_kill.rs b/tests/by-util/test_kill.rs index a664ff0097..1cd4bc7782 100644 --- a/tests/by-util/test_kill.rs +++ b/tests/by-util/test_kill.rs @@ -288,3 +288,13 @@ fn test_kill_no_pid_provided() { .fails() .stderr_contains("no process ID specified"); } + +#[test] +fn test_kill_with_signal_exit_new_form() { + let mut target = Target::new(); + new_ucmd!() + .arg("-s") + .arg("EXIT") + .arg(format!("{}", target.pid())) + .succeeds(); +} From 8cd8417d7517be904bb34aa5bae0812a73edadd6 Mon Sep 17 00:00:00 2001 From: dcarrier Date: Wed, 24 Apr 2024 12:45:00 -0700 Subject: [PATCH 2/4] tests/kill: fix clippy lint --- tests/by-util/test_kill.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/by-util/test_kill.rs b/tests/by-util/test_kill.rs index 1cd4bc7782..90adf5f299 100644 --- a/tests/by-util/test_kill.rs +++ b/tests/by-util/test_kill.rs @@ -291,7 +291,7 @@ fn test_kill_no_pid_provided() { #[test] fn test_kill_with_signal_exit_new_form() { - let mut target = Target::new(); + let target = Target::new(); new_ucmd!() .arg("-s") .arg("EXIT") From 72efad9d809c43eed8b7375a2de39a74f6b2652f Mon Sep 17 00:00:00 2001 From: dcarrier Date: Wed, 24 Apr 2024 14:09:44 -0700 Subject: [PATCH 3/4] kill: add comment explaining SIGEXIT rationale --- src/uu/kill/src/kill.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/uu/kill/src/kill.rs b/src/uu/kill/src/kill.rs index fc52f0317d..7c2472825d 100644 --- a/src/uu/kill/src/kill.rs +++ b/src/uu/kill/src/kill.rs @@ -60,7 +60,10 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } else { 15_usize //SIGTERM }; + let sig_name = signal_name_by_value(sig); + // Signal does not support converting from SIGEXIT/0 + // Instead, nix::signal::kill expects Option::None to properly handle SIGEXIT let sig: Option = if sig_name.is_some_and(|name| name == "EXIT") { None } else { From 73fb84f364fa2e065be5b58f8320bad8a64a2346 Mon Sep 17 00:00:00 2001 From: dcarrier Date: Fri, 26 Apr 2024 12:18:01 -0700 Subject: [PATCH 4/4] kill: change SIGEXIT to EXIT for cspell --- src/uu/kill/src/kill.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/uu/kill/src/kill.rs b/src/uu/kill/src/kill.rs index 7c2472825d..5446a7f182 100644 --- a/src/uu/kill/src/kill.rs +++ b/src/uu/kill/src/kill.rs @@ -62,8 +62,8 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { }; let sig_name = signal_name_by_value(sig); - // Signal does not support converting from SIGEXIT/0 - // Instead, nix::signal::kill expects Option::None to properly handle SIGEXIT + // Signal does not support converting from EXIT + // Instead, nix::signal::kill expects Option::None to properly handle EXIT let sig: Option = if sig_name.is_some_and(|name| name == "EXIT") { None } else {