From 5489611d2bcc6135b8a9b3255f1f9fd27da7c3ab Mon Sep 17 00:00:00 2001 From: xtqqczze <45661989+xtqqczze@users.noreply.github.com> Date: Mon, 28 Sep 2026 16:25:05 +0100 Subject: [PATCH] refactor: replace rustix::process dependency with rlimit --- Cargo.lock | 12 ++++++++++- Cargo.toml | 2 ++ src/uu/sort/Cargo.toml | 1 + src/uu/sort/src/sort.rs | 39 +++++++---------------------------- tests/by-util/test_cat.rs | 6 +++--- tests/by-util/test_cp.rs | 6 +++--- tests/by-util/test_dd.rs | 10 ++++----- tests/by-util/test_expand.rs | 4 ++-- tests/by-util/test_ls.rs | 6 +++--- tests/by-util/test_pr.rs | 4 ++-- tests/by-util/test_sort.rs | 22 ++++++++++---------- tests/by-util/test_split.rs | 6 +++--- tests/by-util/test_tee.rs | 8 +++---- tests/uutests/Cargo.toml | 2 +- tests/uutests/src/lib/util.rs | 31 +++++++++++++++------------- 15 files changed, 75 insertions(+), 84 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0d479030871..ffb4427f28c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -523,6 +523,7 @@ dependencies = [ "pretty_assertions", "rand 0.10.3", "regex", + "rlimit", "rstest", "rstest_reuse", "rustc-hash", @@ -2477,6 +2478,15 @@ version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" +[[package]] +name = "rlimit" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f35ee2729c56bb610f6dba436bf78135f728b7373bdffae2ec815b2d3eb98cc3" +dependencies = [ + "libc", +] + [[package]] name = "roff" version = "1.1.1" @@ -4487,7 +4497,7 @@ dependencies = [ "pretty_assertions", "rand 0.10.3", "regex", - "rustix", + "rlimit", "tempfile", "uucore", "xattr", diff --git a/Cargo.toml b/Cargo.toml index 9af5d2e80c5..0807fc82504 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -113,6 +113,7 @@ rand = { version = "0.10.1", features = ["std_rng"] } rand_chacha = { version = "0.10.0" } rayon = "1.10" regex = "1.10.4" +rlimit = "0.11.0" rstest = "0.27.0" rstest_reuse = "0.7.0" rustc-hash = "2.1.1" @@ -394,6 +395,7 @@ runcon = { optional = true, version = "0.13.0", package = "uu_runcon", path = "s [target.'cfg(unix)'.dev-dependencies] nix = { workspace = true, features = ["fs", "signal"] } +rlimit = { workspace = true } rustix = { workspace = true, features = ["net", "process"] } [build-dependencies] diff --git a/src/uu/sort/Cargo.toml b/src/uu/sort/Cargo.toml index 8a9f447e18f..aef1c78d238 100644 --- a/src/uu/sort/Cargo.toml +++ b/src/uu/sort/Cargo.toml @@ -44,6 +44,7 @@ ctrlc = { workspace = true } [target.'cfg(unix)'.dependencies] libc = { workspace = true } +rlimit = { workspace = true } [dev-dependencies] divan = { workspace = true } diff --git a/src/uu/sort/src/sort.rs b/src/uu/sort/src/sort.rs index 0bdc87dc61b..370a193fa1b 100644 --- a/src/uu/sort/src/sort.rs +++ b/src/uu/sort/src/sort.rs @@ -3,7 +3,7 @@ // For the full copyright and license information, please view the LICENSE // file that was distributed with this source code. -// spell-checker:ignore (misc) kKMGTPEZYRQ HFKJFK Mbdfhn getrlimit Nofile rlim bigdecimal extendedbigdecimal hexdigit behaviour keydef GETFD localeconv foldhash +// spell-checker:ignore (misc) kKMGTPEZYRQ HFKJFK Mbdfhn getrlimit NOFILE rlim bigdecimal extendedbigdecimal hexdigit behaviour keydef GETFD localeconv foldhash // spell-checker:ignore (misc) uppercased qsort getmonth juin juil // Although these links don't always seem to describe reality, check out the POSIX and GNU specs: @@ -1524,49 +1524,24 @@ fn make_sort_mode_arg(mode: &'static str, short: char, help: String) -> Arg { .action(ArgAction::SetTrue) } -#[cfg(all( - unix, - not(any( - target_os = "redox", - target_os = "fuchsia", - target_os = "haiku", - target_os = "solaris", - target_os = "illumos" - )) -))] +#[cfg(unix)] fn get_rlimit() -> UResult { - use rustix::process::{Resource, getrlimit}; + use rlimit::{Resource, getrlimit}; - let rlim_cur = getrlimit(Resource::Nofile) - .current + let rlim_cur = getrlimit(Resource::NOFILE) + .0 .ok_or_else(|| UUsageError::new(2, translate!("sort-failed-fetch-rlimit")))?; usize::try_from(rlim_cur) .map_err(|_| UUsageError::new(2, translate!("sort-failed-fetch-rlimit"))) } -#[cfg(all( - unix, - not(any( - target_os = "redox", - target_os = "fuchsia", - target_os = "haiku", - target_os = "solaris", - target_os = "illumos" - )) -))] +#[cfg(unix)] pub(crate) fn fd_soft_limit() -> Option { get_rlimit().ok() } -#[cfg(any( - not(unix), - target_os = "redox", - target_os = "fuchsia", - target_os = "haiku", - target_os = "solaris", - target_os = "illumos" -))] +#[cfg(not(unix))] pub(crate) fn fd_soft_limit() -> Option { None } diff --git a/tests/by-util/test_cat.rs b/tests/by-util/test_cat.rs index 402bb1a39c9..ddc7eef2b4e 100644 --- a/tests/by-util/test_cat.rs +++ b/tests/by-util/test_cat.rs @@ -3,10 +3,10 @@ // For the full copyright and license information, please view the LICENSE // file that was distributed with this source code. -// spell-checker:ignore Nofile nonewline cmdline setrlimit ELOOP bcde acde +// spell-checker:ignore NOFILE nonewline cmdline setrlimit ELOOP bcde acde #[cfg(any(target_os = "linux", target_os = "android"))] -use rustix::process::Resource; +use rlimit::Resource; #[cfg(unix)] use std::fs::File; use std::fs::OpenOptions; @@ -135,7 +135,7 @@ fn test_closes_file_descriptors() { "alpha.txt", "alpha.txt", ]) - .limit(Resource::Nofile, 9, 9) + .limit(Resource::NOFILE, 9, 9) .succeeds(); } diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index d3474eeb413..e281045f4e9 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -3,7 +3,7 @@ // For the full copyright and license information, please view the LICENSE // file that was distributed with this source code. -// spell-checker:ignore (flags) reflink (fs) tmpfs (linux) filefrag rlimit Rlim Nofile clob btrfs neve ROOTDIR USERDIR outfile subvolume uufs xattrs ELOOP +// spell-checker:ignore (flags) reflink (fs) tmpfs (linux) filefrag rlimit Rlim NOFILE clob btrfs neve ROOTDIR USERDIR outfile subvolume uufs xattrs ELOOP // spell-checker:ignore bdfl hlsl IRWXO IRWXG nconfined matchpathcon libselinux-devel prwx doesnotexist reftests subdirs mksocket srwx dstlink mcstransd #[cfg(unix)] @@ -3448,7 +3448,7 @@ fn test_cp_reflink_insufficient_permission() { #[cfg(target_os = "linux")] #[test] fn test_closes_file_descriptors() { - use rustix::process::Resource; + use rlimit::Resource; let pid = std::process::id(); let fd_path = format!("/proc/{pid}/fd"); @@ -3468,7 +3468,7 @@ fn test_closes_file_descriptors() { .arg("--reflink=auto") .arg("dir_with_10_files/") .arg("dir_with_10_files_new/") - .limit(Resource::Nofile, limit_fd, limit_fd) + .limit(Resource::NOFILE, limit_fd, limit_fd) .succeeds(); } diff --git a/tests/by-util/test_dd.rs b/tests/by-util/test_dd.rs index 420e80ed992..ebf386f66c7 100644 --- a/tests/by-util/test_dd.rs +++ b/tests/by-util/test_dd.rs @@ -3,7 +3,7 @@ // For the full copyright and license information, please view the LICENSE // file that was distributed with this source code. -// spell-checker:ignore fname, tname, fpath, specfile, testfile, unspec, ifile, ofile, outfile, fullblock, urand, fileio, atoe, atoibm, availible, behaviour, bmax, bremain, btotal, cflags, creat, ctable, ctty, datastructures, doesnt, etoa, fileout, fname, gnudd, iconvflags, iseek, nocache, noctty, noerror, nofollow, nolinks, nonblock, oconvflags, oseek, outfile, parseargs, rlen, rmax, rposition, rremain, rsofar, rstat, sigusr, sigval, wlen, wstat abcdefghijklm abcdefghi nabcde nabcdefg abcdefg fifoname FADV DONTNEED Fsize SIGXFSZ rusage maxrss cdefg ncdefg cdefh +// spell-checker:ignore fname, tname, fpath, specfile, testfile, unspec, ifile, ofile, outfile, fullblock, urand, fileio, atoe, atoibm, availible, behaviour, bmax, bremain, btotal, cflags, creat, ctable, ctty, datastructures, doesnt, etoa, fileout, fname, gnudd, iconvflags, iseek, nocache, noctty, noerror, nofollow, nolinks, nonblock, oconvflags, oseek, outfile, parseargs, rlen, rmax, rposition, rremain, rsofar, rstat, sigusr, sigval, wlen, wstat abcdefghijklm abcdefghi nabcde nabcdefg abcdefg fifoname FADV DONTNEED FSIZE SIGXFSZ rusage maxrss cdefg ncdefg cdefh use uutests::at_and_ucmd; use uutests::new_ucmd; @@ -2413,14 +2413,14 @@ fn test_count_bytes_with_expanding_block_conv() { #[test] #[cfg(all(unix, not(target_vendor = "apple")))] fn test_stats_are_reported_when_a_write_fails() { - use rustix::process::Resource; + use rlimit::Resource; const CAP: u64 = 768 * 1024; let (at, mut ucmd) = at_and_ucmd!(); let result = ucmd .args(&["if=/dev/zero", "of=capped.bin", "bs=512K", "count=3"]) - .limit(Resource::Fsize, CAP, CAP) + .limit(Resource::FSIZE, CAP, CAP) .ignore_sigxfsz() .fails(); @@ -2436,7 +2436,7 @@ fn test_stats_are_reported_when_a_write_fails() { #[test] #[cfg(all(unix, not(target_vendor = "apple")))] fn test_block_stats_are_reported_when_a_write_fails() { - use rustix::process::Resource; + use rlimit::Resource; const CAP: u64 = 200 * 1024; @@ -2444,7 +2444,7 @@ fn test_block_stats_are_reported_when_a_write_fails() { let result = ucmd .args(&["conv=block", "cbs=1M", "obs=64K", "of=capped.bin"]) .pipe_in("x\n") - .limit(Resource::Fsize, CAP, CAP) + .limit(Resource::FSIZE, CAP, CAP) .ignore_sigxfsz() .fails(); diff --git a/tests/by-util/test_expand.rs b/tests/by-util/test_expand.rs index 49d19bbe90e..5e702ba0cfa 100644 --- a/tests/by-util/test_expand.rs +++ b/tests/by-util/test_expand.rs @@ -276,12 +276,12 @@ fn test_tabs_with_too_large_size() { )] #[test] fn test_large_tab_stop_without_tabs_does_not_allocate() { - use rustix::process::Resource; + use rlimit::Resource; const AS_LIMIT: u64 = 200 * 1024 * 1024; new_ucmd!() - .limit(Resource::As, AS_LIMIT, AS_LIMIT) + .limit(Resource::AS, AS_LIMIT, AS_LIMIT) .arg("--tabs=267672676527678256") .pipe_in("hello\n") .succeeds() diff --git a/tests/by-util/test_ls.rs b/tests/by-util/test_ls.rs index 2e7e5240731..6efb97e1441 100644 --- a/tests/by-util/test_ls.rs +++ b/tests/by-util/test_ls.rs @@ -4,7 +4,7 @@ // file that was distributed with this source code. // spell-checker:ignore (words) READMECAREFULLY birthtime doesntexist oneline somebackup lrwx somefile somegroup somehiddenbackup somehiddenfile tabsize aaaaaaaa bbbb cccc dddddddd ncccc neee naaaaa nbcdef nfffff dired subdired tmpfs mdir COLORTERM mexe bcdef mfoo timefile -// spell-checker:ignore (words) fakeroot setcap drwxr bcdlps mdangling mentry awith acolons Nofile NOTCAPABLE iproduct newfstatat isox +// spell-checker:ignore (words) fakeroot setcap drwxr bcdlps mdangling mentry awith acolons NOFILE NOTCAPABLE iproduct newfstatat isox #![allow( clippy::similar_names, @@ -14,7 +14,7 @@ use regex::Regex; #[cfg(unix)] -use rustix::process::Resource; +use rlimit::Resource; #[cfg(not(target_os = "openbsd"))] use std::collections::HashMap; #[cfg(target_os = "linux")] @@ -8130,7 +8130,7 @@ fn test_ls_recursive_no_fd_leak() { .ucmd() .arg("-R") .arg("1") - .limit(Resource::Nofile, 20, 20) + .limit(Resource::NOFILE, 20, 20) .succeeds() .no_stderr(); } diff --git a/tests/by-util/test_pr.rs b/tests/by-util/test_pr.rs index 97bc41cf555..f20e1145cf3 100644 --- a/tests/by-util/test_pr.rs +++ b/tests/by-util/test_pr.rs @@ -563,13 +563,13 @@ fn test_large_page_width_does_not_panic() { ignore = "WASI: wasmtime itself needs more memory than the guest's rlimit allows" )] fn test_offset_large_value_does_not_abort_under_memory_limit() { - use rustix::process::Resource; + use rlimit::Resource; use std::process::Stdio; const AS_LIMIT: u64 = 200 * 1024 * 1024; new_ucmd!() - .limit(Resource::As, AS_LIMIT, AS_LIMIT) + .limit(Resource::AS, AS_LIMIT, AS_LIMIT) .set_stdout(Stdio::null()) .args(&["-t", "-o", "999999999"]) .pipe_in("hi\n") diff --git a/tests/by-util/test_sort.rs b/tests/by-util/test_sort.rs index ee06176e3a5..de96ecfbe18 100644 --- a/tests/by-util/test_sort.rs +++ b/tests/by-util/test_sort.rs @@ -3,7 +3,7 @@ // For the full copyright and license information, please view the LICENSE // file that was distributed with this source code. -// spell-checker:ignore (words) ints (linux) Nofile dfgi abmon avril +// spell-checker:ignore (words) ints (linux) NOFILE dfgi abmon avril #![allow(clippy::cast_possible_wrap)] @@ -1788,14 +1788,14 @@ fn test_merge_batch_size() { // #[cfg(any(target_os = "linux", target_os = "android"))] #[cfg(target_os = "linux")] fn test_merge_batch_size_with_limit() { - use rustix::process::Resource; + use rlimit::Resource; // Currently need... // 3 descriptors for stdin, stdout, stderr // 2 descriptors for CTRL+C handling logic (to be reworked at some point) // 2 descriptors for the input files (i.e. batch-size of 2). let limit_fd = 3 + 2 + 2; new_ucmd!() - .limit(Resource::Nofile, limit_fd, limit_fd) + .limit(Resource::NOFILE, limit_fd, limit_fd) .arg("--batch-size=2") .arg("-m") .arg("--unique") @@ -1813,13 +1813,13 @@ fn test_merge_batch_size_with_limit() { // TODO(#7542): Re-enable on Android once we figure out why setting limit is broken. #[cfg(target_os = "linux")] fn test_batch_size_above_fd_limit_is_rejected() { - use rustix::process::Resource; + use rlimit::Resource; // Only stdin, stdout and stderr are unavailable for merge inputs, so the // largest acceptable --batch-size is the soft limit minus 3, here 27 - 3. let limit_fd = 27; let (at, mut ucmd) = at_and_ucmd!(); at.write("gamma.txt", "delta\nalpha\n"); - ucmd.limit(Resource::Nofile, limit_fd, limit_fd) + ucmd.limit(Resource::NOFILE, limit_fd, limit_fd) .arg("--batch-size=31") .arg("gamma.txt") .fails_with_code(2) @@ -1831,12 +1831,12 @@ fn test_batch_size_above_fd_limit_is_rejected() { #[test] #[cfg(target_os = "linux")] fn test_batch_size_at_fd_limit_is_accepted() { - use rustix::process::Resource; + use rlimit::Resource; let limit_fd = 27; let (at, mut ucmd) = at_and_ucmd!(); at.write("gamma.txt", "delta\nalpha\n"); // 24 is the largest value the limit above allows, and sorting must still happen. - ucmd.limit(Resource::Nofile, limit_fd, limit_fd) + ucmd.limit(Resource::NOFILE, limit_fd, limit_fd) .arg("--batch-size=24") .arg("gamma.txt") .succeeds() @@ -1846,7 +1846,7 @@ fn test_batch_size_at_fd_limit_is_accepted() { #[test] #[cfg(target_os = "linux")] fn test_merge_more_files_than_fd_limit() { - use rustix::process::Resource; + use rlimit::Resource; let (at, mut ucmd) = at_and_ucmd!(); // 40 single-line files cannot all be open at once with a soft limit of 24, // so sort has to merge them in several batches through temporary files. @@ -1862,7 +1862,7 @@ fn test_merge_more_files_than_fd_limit() { writeln!(expected, "{i:02}").unwrap(); } let limit_fd = 24; - ucmd.limit(Resource::Nofile, limit_fd, limit_fd) + ucmd.limit(Resource::NOFILE, limit_fd, limit_fd) .arg("-m") .args(&names) .succeeds() @@ -1872,7 +1872,7 @@ fn test_merge_more_files_than_fd_limit() { #[test] #[cfg(target_os = "linux")] fn test_more_files_than_fd_limit() { - use rustix::process::Resource; + use rlimit::Resource; let (at, mut ucmd) = at_and_ucmd!(); // The inputs are read one after another, so sorting must not need more open // file descriptors than the soft limit allows, no matter how many inputs there are. @@ -1888,7 +1888,7 @@ fn test_more_files_than_fd_limit() { writeln!(expected, "{i:02}").unwrap(); } let limit_fd = 24; - ucmd.limit(Resource::Nofile, limit_fd, limit_fd) + ucmd.limit(Resource::NOFILE, limit_fd, limit_fd) .args(&names) .succeeds() .stdout_only(expected); diff --git a/tests/by-util/test_split.rs b/tests/by-util/test_split.rs index 247b807de6e..854320ad181 100644 --- a/tests/by-util/test_split.rs +++ b/tests/by-util/test_split.rs @@ -3,12 +3,12 @@ // For the full copyright and license information, please view the LICENSE // file that was distributed with this source code. -// spell-checker:ignore xzaaa sixhundredfiftyonebytes ninetyonebytes threebytes asciilowercase ghijkl mnopq rstuv wxyz fivelines twohundredfortyonebytes onehundredlines nbbbb dxen ncccc rlimit Nofile +// spell-checker:ignore xzaaa sixhundredfiftyonebytes ninetyonebytes threebytes asciilowercase ghijkl mnopq rstuv wxyz fivelines twohundredfortyonebytes onehundredlines nbbbb dxen ncccc rlimit NOFILE use rand::{RngExt as _, SeedableRng, rng}; use regex::Regex; #[cfg(any(target_os = "linux", target_os = "android"))] -use rustix::process::Resource; +use rlimit::Resource; #[cfg(target_os = "linux")] use std::os::unix::ffi::OsStringExt; use std::path::Path; @@ -1692,7 +1692,7 @@ fn test_round_robin() { fn test_round_robin_limited_file_descriptors() { new_ucmd!() .args(&["-n", "r/40", "onehundredlines.txt"]) - .limit(Resource::Nofile, 9, 9) + .limit(Resource::NOFILE, 9, 9) .succeeds(); } diff --git a/tests/by-util/test_tee.rs b/tests/by-util/test_tee.rs index 00e30eada05..3595e22c8ed 100644 --- a/tests/by-util/test_tee.rs +++ b/tests/by-util/test_tee.rs @@ -3,7 +3,7 @@ // For the full copyright and license information, please view the LICENSE // file that was distributed with this source code. -// spell-checker:ignore nopipe Fsize Nofile sigxfsz +// spell-checker:ignore nopipe FSIZE NOFILE sigxfsz #![allow(clippy::borrow_as_ptr)] @@ -702,7 +702,7 @@ mod linux_only { /// Runs tee with 2 outputs that fail part-way, and checks that the bytes they did /// not take do not end up in the other outputs. fn check_failed_outputs_do_not_spill(open_file_limit: Option) { - use rustix::process::Resource; + use rlimit::Resource; const CAP: u64 = 100 * 1024; let (at, mut ucmd) = at_and_ucmd!(); @@ -713,10 +713,10 @@ mod linux_only { // through tee's 2nd pipe, which stdout and /dev/null keep using after it fails; // "capped2", the last output, through its 1st. ucmd.args(&["capped", "/dev/null", "capped2"]) - .limit(Resource::Fsize, CAP, CAP) + .limit(Resource::FSIZE, CAP, CAP) .ignore_sigxfsz(); if let Some(limit) = open_file_limit { - ucmd.limit(Resource::Nofile, limit, limit); + ucmd.limit(Resource::NOFILE, limit, limit); } let mut child = ucmd .set_stdin(std::fs::File::open(at.plus("in")).unwrap()) diff --git a/tests/uutests/Cargo.toml b/tests/uutests/Cargo.toml index affc98cf28a..071734863ba 100644 --- a/tests/uutests/Cargo.toml +++ b/tests/uutests/Cargo.toml @@ -37,7 +37,7 @@ uucore = { workspace = true, features = [ [target.'cfg(unix)'.dependencies] nix = { workspace = true, features = ["fs", "term"] } -rustix = { workspace = true, features = ["process"] } +rlimit = { workspace = true } [target.'cfg(any(target_os = "freebsd", target_os = "hurd", target_os = "linux", target_os = "android", target_os = "netbsd"))'.dependencies] xattr = { workspace = true } diff --git a/tests/uutests/src/lib/util.rs b/tests/uutests/src/lib/util.rs index 074d3eec226..70ef6402bef 100644 --- a/tests/uutests/src/lib/util.rs +++ b/tests/uutests/src/lib/util.rs @@ -3,9 +3,9 @@ // For the full copyright and license information, please view the LICENSE // file that was distributed with this source code. -//spell-checker:ignore (linux) rlimit prlimit coreutil ggroups uchild uncaptured scmd SHLVL canonicalized openpty -//spell-checker:ignore (linux) winsize xpixel ypixel setrlimit Fsize SIGBUS SIGSEGV SIGXFSZ EFBIG sigbus tmpfs mksocket -//spell-checker:ignore (ToDO) ttyname +//spell-checker: ignore (linux) rlimit prlimit coreutil ggroups uchild uncaptured scmd SHLVL canonicalized openpty +//spell-checker: ignore (linux) winsize xpixel ypixel setrlimit FSIZE SIGBUS SIGSEGV SIGXFSZ EFBIG sigbus tmpfs mksocket +//spell-checker: ignore (ToDO) ttyname #![allow(dead_code)] #![allow( @@ -25,7 +25,7 @@ use nix::sys; use nix::sys::stat::{self, SFlag}; use pretty_assertions::assert_eq; #[cfg(unix)] -use rustix::process::{Resource, Rlimit, setrlimit}; +use rlimit::setrlimit; use std::borrow::Cow; use std::collections::{BTreeMap, VecDeque}; use std::ffi::{OsStr, OsString}; @@ -1551,7 +1551,7 @@ pub struct UCommand { stderr: Option, bytes_into_stdin: Option>, #[cfg(unix)] - limits: Vec<(Resource, u64, u64)>, + limits: Vec<(rlimit::Resource, u64, u64)>, #[cfg(unix)] ignore_sigxfsz: bool, stderr_to_stdout: bool, @@ -1716,7 +1716,12 @@ impl UCommand { } #[cfg(unix)] - pub fn limit(&mut self, resource: Resource, soft_limit: u64, hard_limit: u64) -> &mut Self { + pub fn limit( + &mut self, + resource: rlimit::Resource, + soft_limit: u64, + hard_limit: u64, + ) -> &mut Self { self.limits.push((resource, soft_limit, hard_limit)); self } @@ -2077,13 +2082,7 @@ impl UCommand { let limits_copy = self.limits.clone(); let closure = move || -> Result<()> { for &(resource, soft_limit, hard_limit) in &limits_copy { - setrlimit( - resource, - Rlimit { - current: Some(soft_limit), - maximum: Some(hard_limit), - }, - )?; + setrlimit(resource, soft_limit, hard_limit)?; } Ok(()) }; @@ -3714,7 +3713,11 @@ mod tests { let ts = TestScenario::new("util"); ts.cmd("sh") .args(&["-c", "ulimit -Sf; ulimit -Hf"]) - .limit(Resource::Fsize, 8 * unit_size_bytes, 16 * unit_size_bytes) + .limit( + rlimit::Resource::FSIZE, + 8 * unit_size_bytes, + 16 * unit_size_bytes, + ) .succeeds() .no_stderr() .stdout_is("8\n16\n");