1+ //
2+ // Copyright (c) 2024 Hemi Labs, Inc.
3+ //
4+ // This file is part of the posixutils-rs project covered under
5+ // the MIT License. For the full license text, please see the LICENSE
6+ // file in the root directory of this project.
7+ // SPDX-License-Identifier: MIT
8+ //
9+
110#[ cfg( target_os = "macos" ) ]
211mod psmacos;
312
@@ -23,26 +32,62 @@ struct Args {
2332 /// List all processes
2433 #[ arg( short = 'A' , long) ]
2534 all : bool ,
35+
36+ /// List all processes (alias for -A)
37+ #[ arg( short = 'e' ) ]
38+ all2 : bool ,
39+
40+ /// List all processes associated with terminals
41+ #[ arg( short = 'a' , long) ]
42+ terminal_processes : bool ,
43+
44+ /// Exclude session leaders
45+ #[ arg( short = 'd' , long) ]
46+ exclude_session_leaders : bool ,
2647}
2748
2849fn main ( ) {
29- let args = Args :: parse ( ) ;
30-
31- if args. all {
32- match platform:: list_processes ( ) {
33- Ok ( processes) => {
34- println ! (
35- "{:<5} {:<5} {:<5} {:<5} {}" ,
36- "PID" , "PPID" , "UID" , "GID" , "COMMAND"
37- ) ;
38- for proc in processes {
39- println ! (
40- "{:<5} {:<5} {:<5} {:<5} {}" ,
41- proc. pid, proc. ppid, proc. uid, proc. gid, proc. path
42- ) ;
43- }
44- }
45- Err ( e) => eprintln ! ( "Error: {}" , e) ,
50+ let mut args = Args :: parse ( ) ;
51+ if args. all2 {
52+ args. all = true ;
53+ }
54+
55+ let processes = match platform:: list_processes ( ) {
56+ Ok ( processes) => processes,
57+ Err ( e) => {
58+ eprintln ! ( "Error: {}" , e) ;
59+ return ;
4660 }
61+ } ;
62+
63+ // Filter processes based on arguments
64+ let filtered_processes = if args. terminal_processes && args. exclude_session_leaders {
65+ processes
66+ . into_iter ( )
67+ . filter ( |p| p. tty . is_some ( ) && p. pid != p. sid ) // -a and -d logic
68+ . collect :: < Vec < _ > > ( )
69+ } else if args. terminal_processes {
70+ processes
71+ . into_iter ( )
72+ . filter ( |p| p. tty . is_some ( ) ) // -a logic
73+ . collect :: < Vec < _ > > ( )
74+ } else if args. exclude_session_leaders {
75+ processes
76+ . into_iter ( )
77+ . filter ( |p| p. pid != p. sid ) // -d logic
78+ . collect :: < Vec < _ > > ( )
79+ } else {
80+ processes
81+ } ;
82+
83+ println ! (
84+ "{:<5} {:<5} {:<5} {:<5} {}" ,
85+ "PID" , "PPID" , "UID" , "GID" , "COMMAND"
86+ ) ;
87+ for proc in filtered_processes {
88+ println ! (
89+ "{:<5} {:<5} {:<5} {:<5} {}" ,
90+ proc. pid, proc. ppid, proc. uid, proc. gid, proc. path
91+ ) ;
4792 }
4893}
0 commit comments