feat, fix: add nproc, make dd's output more busybox-like

This commit is contained in:
user0-07161 2025-03-22 13:22:23 +01:00
parent b2cdb5d3ca
commit 21743a5c07
7 changed files with 112 additions and 5 deletions

23
Cargo.lock generated
View file

@ -11,6 +11,29 @@ name = "coreutils"
version = "0.1.0"
dependencies = [
"boxutils",
"num_cpus",
]
[[package]]
name = "hermit-abi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
[[package]]
name = "libc"
version = "0.2.171"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6"
[[package]]
name = "num_cpus"
version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
dependencies = [
"hermit-abi",
"libc",
]
[[package]]

23
coreutils/Cargo.lock generated
View file

@ -11,4 +11,27 @@ name = "coreutils"
version = "0.1.0"
dependencies = [
"boxutils",
"num_cpus",
]
[[package]]
name = "hermit-abi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
[[package]]
name = "libc"
version = "0.2.171"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6"
[[package]]
name = "num_cpus"
version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
dependencies = [
"hermit-abi",
"libc",
]

View file

@ -5,3 +5,4 @@ edition = "2024"
[dependencies]
boxutils = { path = "../utils" }
num_cpus = "1.16.0"

View file

@ -25,7 +25,7 @@ impl Command for Dd {
if v.parse::<u64>().is_ok() {
// assume the bs is specified in bytes,
// because the last char is a number
blocksize = bs.parse::<u64>().unwrap()
blocksize = bs.parse::<u64>().unwrap()
} else {
match v {
"K" | "k" => blocksize = k.parse::<u64>().unwrap() * 1024,
@ -59,8 +59,8 @@ impl Command for Dd {
let _ = io::stdout().write_all(&vecbuf);
}
let duration = start.elapsed().as_millis() / 1000;
let duration = start.elapsed().as_secs_f64();
let kb_per_sec = (vecbuf.len() as f64 / 1024.0) / duration;
let out_blocks = vecbuf.len() as u64 / blocksize;
let out_remainder = vecbuf.len() as u64 % blocksize;
@ -77,9 +77,12 @@ impl Command for Dd {
);
println!(
"{} bytes copied, ca. {} seconds",
"{} bytes ({}B) copied, {:.6} seconds, {:.2}KB/s",
vecbuf.len(),
duration
vecbuf.len(),
duration,
kb_per_sec
)
}
}

View file

@ -12,3 +12,6 @@ pub use mkdir::Mkdir;
mod dd;
pub use dd::Dd;
mod nproc;
pub use nproc::Nproc;

View file

@ -0,0 +1,53 @@
use boxutils::commands::Command;
use boxutils::args::ArgParser;
use std::env;
use num_cpus::{get, get_physical};
pub struct Nproc;
impl Command for Nproc {
fn execute(&self) {
let raw_args = env::args().collect::<Vec<_>>();
let args = ArgParser::builder()
.add_flag("--help")
.add_flag("--ignore")
.add_flag("--all")
.parse("nproc", raw_args);
let mut ignore: u64 = 0;
let mut all = false;
if args.get_flag("--help") {
println!(
"
Usage: nproc [--all] [ignore=N]
Prints the number of available CPUs to stdout.
--all List all installed CPUs
--ignore=N, --ignore N Ignore N CPUs
"
);
return
}
if args.get_flag("--all") {
all = true;
}
if args.get_flag("--ignore") {
ignore = args.get_option("--ignore").unwrap().parse().unwrap();
}
for argument in args.get_normal_args() {
if let Some((k, v)) = argument.split_once('=') {
if k == "--ignore" {
ignore = v.parse().unwrap();
}
}
}
if all {
println!("{}", get() as u64 - ignore) // TODO: actually make `--all` do something
} else {
println!("{}", get() as u64 - ignore)
}
}
}

View file

@ -10,6 +10,7 @@ pub fn get_registry() -> CommandRegistry {
registry.register("mkdir", Box::new(coreutils::commands::Mkdir));
registry.register("ash", Box::new(shell::ash::Ash));
registry.register("dd", Box::new(coreutils::commands::Dd));
registry.register("nproc", Box::new(coreutils::commands::Nproc));
registry.register("box", Box::new(Boxcmd));
registry