From 49c7d72f0d220b12e32b9e781abd11e9113642f6 Mon Sep 17 00:00:00 2001 From: Tuomas Tynkkynen Date: Sat, 25 Oct 2025 18:36:57 +0300 Subject: [PATCH 1/4] ps: Sort before dedup dedup_by() only deduplicates consecutively identical elements, so `ps -A` is returning some processes twice. --- src/uu/ps/src/ps.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/uu/ps/src/ps.rs b/src/uu/ps/src/ps.rs index fa4f9ea..2c780dd 100644 --- a/src/uu/ps/src/ps.rs +++ b/src/uu/ps/src/ps.rs @@ -42,6 +42,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { proc_infos.extend(collector::process_collector(&matches, &snapshot)); proc_infos.extend(collector::session_collector(&matches, &snapshot)); + proc_infos.sort_by(|a, b| a.borrow().pid.cmp(&b.borrow().pid)); proc_infos.dedup_by(|a, b| a.borrow().pid == b.borrow().pid); sorting::sort(&mut proc_infos, &matches); From 701333c56b7bbe2e5ae5cf65f7d916311ee0a2c6 Mon Sep 17 00:00:00 2001 From: Tuomas Tynkkynen Date: Sat, 25 Oct 2025 14:15:33 +0300 Subject: [PATCH 2/4] ps: Only include basic_collector if no other arguments Otherwise listed processes would always be a super-set of what the default output lists, which is not correct since for example `ps -d` would report too many processes. --- src/uu/ps/src/ps.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/uu/ps/src/ps.rs b/src/uu/ps/src/ps.rs index 2c780dd..6704c8b 100644 --- a/src/uu/ps/src/ps.rs +++ b/src/uu/ps/src/ps.rs @@ -38,9 +38,12 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { .collect::>(); let mut proc_infos = Vec::new(); - proc_infos.extend(collector::basic_collector(&snapshot)); - proc_infos.extend(collector::process_collector(&matches, &snapshot)); - proc_infos.extend(collector::session_collector(&matches, &snapshot)); + if !matches.get_flag("A") && !matches.get_flag("a") && !matches.get_flag("d") { + proc_infos.extend(collector::basic_collector(&snapshot)); + } else { + proc_infos.extend(collector::process_collector(&matches, &snapshot)); + proc_infos.extend(collector::session_collector(&matches, &snapshot)); + } proc_infos.sort_by(|a, b| a.borrow().pid.cmp(&b.borrow().pid)); proc_infos.dedup_by(|a, b| a.borrow().pid == b.borrow().pid); From 8edbe400b694a5c80df462ca2d86100744a64c5d Mon Sep 17 00:00:00 2001 From: Tuomas Tynkkynen Date: Sat, 25 Oct 2025 14:14:57 +0300 Subject: [PATCH 3/4] ps: Properly implement `-d` flag --- src/uu/ps/src/collector.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/uu/ps/src/collector.rs b/src/uu/ps/src/collector.rs index 2649a41..bd96c53 100644 --- a/src/uu/ps/src/collector.rs +++ b/src/uu/ps/src/collector.rs @@ -85,9 +85,14 @@ pub(crate) fn session_collector( let tty = |proc: &Rc>| proc.borrow_mut().tty(); // flag `-d` - // TODO: Implementation this collection, guessing it pid=sid if matches.get_flag("d") { - proc_snapshot.iter().for_each(|_| {}); + for proc_info in proc_snapshot { + let pid = proc_info.borrow().pid; + + if getsid(pid as i32) != Some(pid as i32) { + result.push(proc_info.clone()); + } + } } // flag `-a` From 29b8eb24e11d064e0257fc1c9ec3d6632e29ed4c Mon Sep 17 00:00:00 2001 From: Tuomas Tynkkynen Date: Sat, 25 Oct 2025 14:15:56 +0300 Subject: [PATCH 4/4] ps: Add euid check for default output format For instance, leaving a `sudo sleep 9999 &` running in the same terminal shouldn't be displayed. Clean up code a bit by utilizing current_process_info(). --- src/uu/ps/src/collector.rs | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/uu/ps/src/collector.rs b/src/uu/ps/src/collector.rs index bd96c53..e19e3fd 100644 --- a/src/uu/ps/src/collector.rs +++ b/src/uu/ps/src/collector.rs @@ -6,7 +6,7 @@ use clap::ArgMatches; #[cfg(target_family = "unix")] use nix::errno::Errno; -use std::{cell::RefCell, path::PathBuf, rc::Rc, str::FromStr}; +use std::{cell::RefCell, rc::Rc}; use uu_pgrep::process::{ProcessInformation, Teletype}; // TODO: Temporary add to this file, this function will add to uucore. @@ -29,25 +29,18 @@ fn getsid(_pid: i32) -> Option { Some(0) } -// Guessing it matches the current terminal +// Default behavior: select processes with same terminal and same effective user ID pub(crate) fn basic_collector( proc_snapshot: &[Rc>], ) -> Vec>> { let mut result = Vec::new(); - let current_tty = { - // SAFETY: The `libc::getpid` always return i32 - let proc_path = - PathBuf::from_str(&format!("/proc/{}/", unsafe { libc::getpid() })).unwrap(); - let current_proc_info = ProcessInformation::try_new(proc_path).unwrap(); - - current_proc_info.tty() - }; + let mut cur = ProcessInformation::current_process_info().unwrap(); + let tty = cur.tty(); + let euid = cur.euid().unwrap(); for proc_info in proc_snapshot { - let proc_ttys = proc_info.borrow().tty(); - - if proc_ttys == current_tty { + if proc_info.borrow().tty() == tty && proc_info.borrow_mut().euid().unwrap() == euid { result.push(proc_info.clone()); } }