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
+
1
10
#[ cfg( target_os = "macos" ) ]
2
11
mod psmacos;
3
12
@@ -23,26 +32,62 @@ struct Args {
23
32
/// List all processes
24
33
#[ arg( short = 'A' , long) ]
25
34
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 ,
26
47
}
27
48
28
49
fn 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 ;
46
60
}
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
+ ) ;
47
92
}
48
93
}
0 commit comments