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