1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-30 12:37:49 +00:00

Merge pull request #6382 from BenWiederhake/dev-signal-casing

uucore+timeout: accept signals of any casing
This commit is contained in:
Sylvestre Ledru 2024-07-09 23:18:25 +02:00 committed by GitHub
commit c90b69398f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 23 additions and 12 deletions

View file

@ -200,8 +200,7 @@ fn list(signals: &Vec<String>) {
} }
fn parse_signal_value(signal_name: &str) -> UResult<usize> { fn parse_signal_value(signal_name: &str) -> UResult<usize> {
let signal_name_upcase = signal_name.to_uppercase(); let optional_signal_value = signal_by_name_or_value(signal_name);
let optional_signal_value = signal_by_name_or_value(&signal_name_upcase);
match optional_signal_value { match optional_signal_value {
Some(x) => Ok(x), Some(x) => Ok(x),
None => Err(USimpleError::new( None => Err(USimpleError::new(

View file

@ -348,14 +348,15 @@ pub static ALL_SIGNALS: [&str; 37] = [
/// Returns the signal number for a given signal name or value. /// Returns the signal number for a given signal name or value.
pub fn signal_by_name_or_value(signal_name_or_value: &str) -> Option<usize> { pub fn signal_by_name_or_value(signal_name_or_value: &str) -> Option<usize> {
if let Ok(value) = signal_name_or_value.parse() { let signal_name_upcase = signal_name_or_value.to_uppercase();
if let Ok(value) = signal_name_upcase.parse() {
if is_signal(value) { if is_signal(value) {
return Some(value); return Some(value);
} else { } else {
return None; return None;
} }
} }
let signal_name = signal_name_or_value.trim_start_matches("SIG"); let signal_name = signal_name_upcase.trim_start_matches("SIG");
ALL_SIGNALS.iter().position(|&s| s == signal_name) ALL_SIGNALS.iter().position(|&s| s == signal_name)
} }

View file

@ -97,13 +97,15 @@ fn test_preserve_status() {
fn test_preserve_status_even_when_send_signal() { fn test_preserve_status_even_when_send_signal() {
// When sending CONT signal, process doesn't get killed or stopped. // When sending CONT signal, process doesn't get killed or stopped.
// So, expected result is success and code 0. // So, expected result is success and code 0.
for cont_spelling in ["CONT", "cOnT", "SIGcont"] {
new_ucmd!() new_ucmd!()
.args(&["-s", "CONT", "--preserve-status", ".1", "sleep", "5"]) .args(&["-s", cont_spelling, "--preserve-status", ".1", "sleep", "2"])
.succeeds() .succeeds()
.code_is(0) .code_is(0)
.no_stderr() .no_stderr()
.no_stdout(); .no_stdout();
} }
}
#[test] #[test]
fn test_dont_overflow() { fn test_dont_overflow() {

View file

@ -3193,8 +3193,6 @@ mod tests {
#[cfg(feature = "sleep")] #[cfg(feature = "sleep")]
#[cfg(unix)] #[cfg(unix)]
#[rstest] #[rstest]
#[case::signal_full_name_lower_case("sigkill")]
#[case::signal_short_name_lower_case("kill")]
#[case::signal_only_part_of_name("IGKILL")] // spell-checker: disable-line #[case::signal_only_part_of_name("IGKILL")] // spell-checker: disable-line
#[case::signal_just_sig("SIG")] #[case::signal_just_sig("SIG")]
#[case::signal_value_too_high("100")] #[case::signal_value_too_high("100")]
@ -3207,6 +3205,17 @@ mod tests {
result.signal_name_is(signal_name); result.signal_name_is(signal_name);
} }
#[test]
#[cfg(feature = "sleep")]
#[cfg(unix)]
fn test_cmd_result_signal_name_is_accepts_lowercase() {
let mut child = TestScenario::new("sleep").ucmd().arg("60").run_no_wait();
child.kill();
let result = child.wait().unwrap();
result.signal_name_is("sigkill");
result.signal_name_is("kill");
}
#[test] #[test]
#[cfg(unix)] #[cfg(unix)]
fn test_parse_coreutil_version() { fn test_parse_coreutil_version() {