From 81d0e1776d45d1b9c83643ecb5cb5e68ada866d9 Mon Sep 17 00:00:00 2001 From: Pierre Warnier Date: Tue, 24 Mar 2026 13:05:40 +0100 Subject: [PATCH] docs/fixes: man pages, benchmarks, BSD research, Copilot findings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #56 — 14 man pages in docs/man/ (markdown format). Fixes #67 — 8 Copilot findings fixed: - useradd: proper date validation (Feb 31 rejected) - userdel/usermod: --root wired to SysRoot - usermod: --expiredate validates input - usermod: --login validates name + updates shadow/group - userdel: -f separated from -r behavior - useradd: home dir resolved through SysRoot - skel: preserves directory permissions Fixes #69 — benchmark script (benches/benchmark.sh) Fixes #70 — FreeBSD/NetBSD reference (docs/FREEBSD-NETBSD-REFERENCE.md) 456 tests, zero clippy warnings. --- benches/benchmark.sh | 270 +++++++++++++++++++++++++++++++ docs/FREEBSD-NETBSD-REFERENCE.md | 63 ++++++++ docs/man/chage.1.md | 70 ++++++++ docs/man/chfn.1.md | 60 +++++++ docs/man/chpasswd.8.md | 56 +++++++ docs/man/chsh.1.md | 50 ++++++ docs/man/groupadd.8.md | 80 +++++++++ docs/man/groupdel.8.md | 54 +++++++ docs/man/groupmod.8.md | 70 ++++++++ docs/man/grpck.8.md | 68 ++++++++ docs/man/newgrp.1.md | 50 ++++++ docs/man/passwd.1.md | 104 ++++++++++++ docs/man/pwck.8.md | 74 +++++++++ docs/man/useradd.8.md | 136 ++++++++++++++++ docs/man/userdel.8.md | 67 ++++++++ docs/man/usermod.8.md | 93 +++++++++++ src/shadow-core/src/skel.rs | 6 + src/uu/useradd/src/useradd.rs | 111 +++++++++++-- src/uu/userdel/src/userdel.rs | 7 +- src/uu/usermod/src/usermod.rs | 58 ++++++- 20 files changed, 1525 insertions(+), 22 deletions(-) create mode 100755 benches/benchmark.sh create mode 100644 docs/FREEBSD-NETBSD-REFERENCE.md create mode 100644 docs/man/chage.1.md create mode 100644 docs/man/chfn.1.md create mode 100644 docs/man/chpasswd.8.md create mode 100644 docs/man/chsh.1.md create mode 100644 docs/man/groupadd.8.md create mode 100644 docs/man/groupdel.8.md create mode 100644 docs/man/groupmod.8.md create mode 100644 docs/man/grpck.8.md create mode 100644 docs/man/newgrp.1.md create mode 100644 docs/man/passwd.1.md create mode 100644 docs/man/pwck.8.md create mode 100644 docs/man/useradd.8.md create mode 100644 docs/man/userdel.8.md create mode 100644 docs/man/usermod.8.md diff --git a/benches/benchmark.sh b/benches/benchmark.sh new file mode 100755 index 0000000..9f8a625 --- /dev/null +++ b/benches/benchmark.sh @@ -0,0 +1,270 @@ +#!/usr/bin/env bash +# spell-checker:ignore timeformat tempdir ldd passwd pwck +# +# Benchmark script for shadow-rs vs GNU shadow-utils. +# +# Compares performance, binary size, and shared library dependencies +# between shadow-rs (Rust) and GNU shadow-utils (C) implementations. +# +# Usage: +# docker compose run --rm debian bash benches/benchmark.sh +# +# Requirements: +# - Must run inside Docker (needs both GNU shadow-utils and shadow-rs) +# - Must run as root (passwd -S and pwck require root or shadow access) +# +# The script builds shadow-rs in release mode, locates GNU shadow-utils +# binaries, and runs comparative benchmarks. + +set -euo pipefail + +# --------------------------------------------------------------------------- +# Configuration +# --------------------------------------------------------------------------- + +PASSWD_STATUS_ITERS=1000 +PWCK_ITERS=100 + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +log() { printf '\033[1;34m==> %s\033[0m\n' "$*"; } +warn() { printf '\033[1;33mWARN: %s\033[0m\n' "$*"; } +err() { printf '\033[1;31mERROR: %s\033[0m\n' "$*"; exit 1; } + +# Print a separator line. +separator() { printf '%.0s-' {1..72}; printf '\n'; } + +# Format bytes as human-readable. +human_size() { + local bytes=$1 + if [ "$bytes" -ge 1048576 ]; then + printf '%.1f MiB' "$(echo "$bytes / 1048576" | bc -l)" + elif [ "$bytes" -ge 1024 ]; then + printf '%.1f KiB' "$(echo "$bytes / 1024" | bc -l)" + else + printf '%d B' "$bytes" + fi +} + +# Time a command N times, report wall-clock total in seconds. +# Usage: bench_command