diff --git a/src/uu/ps/src/collector.rs b/src/uu/ps/src/collector.rs index 2649a41..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()); } } @@ -85,9 +78,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` diff --git a/src/uu/ps/src/ps.rs b/src/uu/ps/src/ps.rs index fa4f9ea..6704c8b 100644 --- a/src/uu/ps/src/ps.rs +++ b/src/uu/ps/src/ps.rs @@ -38,10 +38,14 @@ 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); sorting::sort(&mut proc_infos, &matches);