@@ -12,45 +12,49 @@ const c = @cImport({
12
12
13
13
pub const Options = struct {
14
14
single : bool = false ,
15
- separator : []const u8 = " " ,
15
+ delimiter : []const u8 = " " ,
16
+ strict : bool = false ,
16
17
user_only : bool = false ,
17
18
version : bool = false ,
18
19
help : bool = false ,
19
20
20
21
pub const __shorts__ = .{
21
22
.single = .s ,
22
- .separator = .S ,
23
+ .delimiter = .d ,
24
+ .strict = .S ,
23
25
.user_only = .u ,
24
26
.version = .v ,
25
27
.help = .h ,
26
28
};
27
29
pub const __messages__ = .{
28
- .single = "Single shot - this instructs the program to only return one pid." ,
29
- .separator = "Use separator as a separator put between pids." ,
30
+ .single = "Only return the first matching pid." ,
31
+ .delimiter = "Delimiter used if more than one PID is shown." ,
32
+ .strict = "Case sensitive when matching program name." ,
30
33
.user_only = "Only show process belonging to current user." ,
31
34
.version = "Print version." ,
32
35
.help = "Print help message." ,
33
36
};
34
37
};
35
38
36
- pub fn findPids (allocator : std.mem.Allocator , opt : Options , program : []const u8 ) ! std. ArrayList (c .pid_t ) {
39
+ pub fn searchPids (allocator : std.mem.Allocator , opt : Options , program : []const u8 ) ! std. ArrayList (c .pid_t ) {
37
40
var mib = [_ ]c_int {
38
41
c .CTL_KERN ,
39
42
c .KERN_PROC ,
40
43
c .KERN_PROC_ALL ,
41
44
};
42
45
var procSize : usize = 0 ;
46
+ // sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen);
43
47
var rc = c .sysctl (& mib , mib .len , null , & procSize , null , 0 );
44
48
if (rc != 0 ) {
45
- std .debug . print ("get proc size, err:{any}" , .{std .posix .errno (rc )});
49
+ std .log . err ("get proc size, err:{any}" , .{std .posix .errno (rc )});
46
50
return error .sysctl ;
47
51
}
48
52
49
53
const procList = try allocator .alloc (c .struct_kinfo_proc , procSize / @sizeOf (c .struct_kinfo_proc ));
50
54
// https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/sysctl.3.html
51
55
rc = c .sysctl (& mib , mib .len , @ptrCast (procList ), & procSize , null , 0 );
52
56
if (rc != 0 ) {
53
- std .debug . print ("get proc list failed, err:{any}" , .{std .posix .errno (rc )});
57
+ std .log . err ("get proc list failed, err:{any}" , .{std .posix .errno (rc )});
54
58
return error .sysctl ;
55
59
}
56
60
@@ -69,10 +73,13 @@ pub fn findPids(allocator: std.mem.Allocator, opt: Options, program: []const u8)
69
73
}
70
74
}
71
75
72
- // p_comm is [17]u8
73
76
const name = std .mem .sliceTo (& proc .kp_proc .p_comm , 0 );
74
- if (program .len >= name .len ) {
75
- if (std .mem .eql (u8 , name , program [0.. name .len ])) {
77
+ if (opt .strict ) {
78
+ if (std .mem .eql (u8 , name , program )) {
79
+ try pids .append (proc .kp_proc .p_pid );
80
+ }
81
+ } else {
82
+ if (std .ascii .eqlIgnoreCase (name , program )) {
76
83
try pids .append (proc .kp_proc .p_pid );
77
84
}
78
85
}
@@ -90,21 +97,20 @@ pub fn main() !void {
90
97
defer opt .deinit ();
91
98
92
99
if (opt .positional_args .len == 0 ) {
93
- std .debug . print ("program is not given" , .{});
100
+ std .log . err ("program is not given" , .{});
94
101
std .posix .exit (1 );
95
102
}
96
103
97
104
const program = opt .positional_args [0 ];
98
-
99
- const pids = try findPids (allocator , opt .args , program );
105
+ const pids = try searchPids (allocator , opt .args , program );
100
106
if (pids .items .len == 0 ) {
101
107
std .posix .exit (1 );
102
108
}
103
109
104
110
var stdout = std .io .getStdOut ().writer ();
105
111
for (pids .items , 0.. ) | pid , i | {
106
112
if (i > 0 ) {
107
- try stdout .writeAll (opt .args .separator );
113
+ try stdout .writeAll (opt .args .delimiter );
108
114
}
109
115
try stdout .print ("{d}" , .{pid });
110
116
}
0 commit comments