From e9d1600bc4248594d52ac8e332f053c9a1ae5598 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Wed, 12 Mar 2025 10:05:26 +0100 Subject: [PATCH] Add renice Co-authored-by: Sylvestre Ledru --- Cargo.lock | 10 ++++++ Cargo.toml | 2 ++ src/uu/renice/Cargo.toml | 17 ++++++++++ src/uu/renice/renice.md | 7 ++++ src/uu/renice/src/main.rs | 1 + src/uu/renice/src/renice.rs | 65 ++++++++++++++++++++++++++++++++++++ tests/by-util/test_renice.rs | 12 +++++++ tests/tests.rs | 4 +++ 8 files changed, 118 insertions(+) create mode 100644 src/uu/renice/Cargo.toml create mode 100644 src/uu/renice/renice.md create mode 100644 src/uu/renice/src/main.rs create mode 100644 src/uu/renice/src/renice.rs create mode 100644 tests/by-util/test_renice.rs diff --git a/Cargo.lock b/Cargo.lock index 597007f..d144ce2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -978,6 +978,7 @@ dependencies = [ "uu_lsmem", "uu_mesg", "uu_mountpoint", + "uu_renice", "uu_rev", "uu_setsid", "uucore", @@ -1085,6 +1086,15 @@ dependencies = [ "uucore", ] +[[package]] +name = "uu_renice" +version = "0.0.1" +dependencies = [ + "clap", + "libc", + "uucore", +] + [[package]] name = "uu_rev" version = "0.0.1" diff --git a/Cargo.toml b/Cargo.toml index e4242c5..de7e7bf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,6 +36,7 @@ feat_common_core = [ "lsmem", "mesg", "mountpoint", + "renice", "rev", "setsid", ] @@ -82,6 +83,7 @@ lslocks = { optional = true, version = "0.0.1", package = "uu_lslocks", path = " lsmem = { optional = true, version = "0.0.1", package = "uu_lsmem", path = "src/uu/lsmem" } mesg = { optional = true, version = "0.0.1", package = "uu_mesg", path = "src/uu/mesg" } mountpoint = { optional = true, version = "0.0.1", package = "uu_mountpoint", path = "src/uu/mountpoint" } +renice = { optional = true, version = "0.0.1", package = "uu_renice", path = "src/uu/renice" } rev = { optional = true, version = "0.0.1", package = "uu_rev", path = "src/uu/rev" } setsid = { optional = true, version = "0.0.1", package = "uu_setsid", path ="src/uu/setsid" } diff --git a/src/uu/renice/Cargo.toml b/src/uu/renice/Cargo.toml new file mode 100644 index 0000000..7679013 --- /dev/null +++ b/src/uu/renice/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "uu_renice" +version = "0.0.1" +edition = "2021" +description = "renice ~ (uutils) Alter priority of running processes" + +[lib] +path = "src/renice.rs" + +[[bin]] +name = "renice" +path = "src/main.rs" + +[dependencies] +clap = { workspace = true } +libc = { workspace = true } +uucore = { workspace = true } diff --git a/src/uu/renice/renice.md b/src/uu/renice/renice.md new file mode 100644 index 0000000..43fd7e5 --- /dev/null +++ b/src/uu/renice/renice.md @@ -0,0 +1,7 @@ +# renice + +``` +renice [--priority|--relative] priority [-g|-p|-u] identifier... +``` + +Alter priority of running processes \ No newline at end of file diff --git a/src/uu/renice/src/main.rs b/src/uu/renice/src/main.rs new file mode 100644 index 0000000..899bccb --- /dev/null +++ b/src/uu/renice/src/main.rs @@ -0,0 +1 @@ +uucore::bin!(uu_renice); diff --git a/src/uu/renice/src/renice.rs b/src/uu/renice/src/renice.rs new file mode 100644 index 0000000..ffb5bf4 --- /dev/null +++ b/src/uu/renice/src/renice.rs @@ -0,0 +1,65 @@ +// This file is part of the uutils util-linux package. +// +// For the full copyright and license information, please view the LICENSE +// file that was distributed with this source code. + +use clap::{crate_version, Arg, Command}; +#[cfg(not(windows))] +use libc::PRIO_PROCESS; +use std::env; +#[cfg(not(windows))] +use std::io::Error; +use std::process; +use uucore::{error::UResult, format_usage, help_about, help_usage}; + +const ABOUT: &str = help_about!("renice.md"); +const USAGE: &str = help_usage!("renice.md"); + +#[uucore::main] +pub fn uumain(args: impl uucore::Args) -> UResult<()> { + let matches = uu_app().try_get_matches_from(args)?; + + let nice_value_str = matches.get_one::("nice_value").unwrap(); // Retrieve as String + let nice_value = nice_value_str.parse::().unwrap_or_else(|_| { + eprintln!("Invalid nice value"); + process::exit(1); + }); + + let pid_str = matches.get_one::("pid").unwrap(); // Retrieve as String + let pid = pid_str.parse::().unwrap_or_else(|_| { + eprintln!("Invalid PID"); + process::exit(1); + }); + + // TODO: implement functionality on windows + #[cfg(not(windows))] + if unsafe { libc::setpriority(PRIO_PROCESS, pid.try_into().unwrap(), nice_value) } == -1 { + eprintln!("Failed to set nice value: {}", Error::last_os_error()); + process::exit(1); + } + + println!("Nice value of process {} set to {}", pid, nice_value); + Ok(()) +} + +pub fn uu_app() -> Command { + Command::new(uucore::util_name()) + .version(crate_version!()) + .about(ABOUT) + .override_usage(format_usage(USAGE)) + .infer_long_args(true) + .arg( + Arg::new("nice_value") + .value_name("NICE_VALUE") + .help("The new nice value for the process") + .required(true) + .index(1), + ) + .arg( + Arg::new("pid") + .value_name("PID") + .help("The PID of the process") + .required(true) + .index(2), + ) +} diff --git a/tests/by-util/test_renice.rs b/tests/by-util/test_renice.rs new file mode 100644 index 0000000..94285a4 --- /dev/null +++ b/tests/by-util/test_renice.rs @@ -0,0 +1,12 @@ +// This file is part of the uutils util-linux package. +// +// For the full copyright and license information, please view the LICENSE +// file that was distributed with this source code. +// spell-checker:ignore (words) symdir somefakedir + +use crate::common::util::TestScenario; + +#[test] +fn test_invalid_arg() { + new_ucmd!().arg("--definitely-invalid").fails().code_is(1); +} diff --git a/tests/tests.rs b/tests/tests.rs index 8d72ee6..c2054a5 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -33,6 +33,10 @@ mod test_blockdev; #[path = "by-util/test_ctrlaltdel.rs"] mod test_ctrlaltdel; +#[cfg(feature = "renice")] +#[path = "by-util/test_renice.rs"] +mod test_renice; + #[cfg(feature = "rev")] #[path = "by-util/test_rev.rs"] mod test_rev;