forge
login
or
join now
1a-insec.net
/
dinit-edit
star
0
fork
atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
A CLI tool to edit dinit service files with ease
star
0
fork
atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
overview
issues
pulls
pipelines
++
iacore
10 months ago
e091c4d1
+55
2 changed files
expand all
collapse all
unified
split
main.zig
readme.md
+50
main.zig
reviewed
···
1
1
+
const std = @import("std");
2
2
+
3
3
+
const a = std.heap.smp_allocator;
4
4
+
5
5
+
pub fn main() !void {
6
6
+
const uid = std.posix.system.getuid();
7
7
+
8
8
+
var service_dirs: std.ArrayListUnmanaged([:0]const u8) = .empty;
9
9
+
if (uid == 0) {
10
10
+
var default_system = [_][:0]const u8{ "/etc/dinit.d", "/run/dinit.d", "/usr/local/lib/dinit.d", "/lib/dinit.d" };
11
11
+
service_dirs = .fromOwnedSlice(&default_system);
12
12
+
} else {
13
13
+
service_dirs = try .initCapacity(a, 5);
14
14
+
if (std.posix.getenv("XDG_CONFIG_HOME")) |prefix| {
15
15
+
service_dirs.appendAssumeCapacity(try std.fmt.allocPrintZ(a, "{s}/dinit.d", .{prefix}));
16
16
+
}
17
17
+
if (std.posix.getenv("HOME")) |prefix| {
18
18
+
service_dirs.appendAssumeCapacity(try std.fmt.allocPrintZ(a, "{s}/.config/dinit.d", .{prefix}));
19
19
+
}
20
20
+
service_dirs.appendSliceAssumeCapacity(&.{ "/etc/dinit.d/user", "/usr/lib/dinit.d/user", "/usr/local/lib/dinit.d/user" });
21
21
+
}
22
22
+
23
23
+
var services: std.StringArrayHashMapUnmanaged([:0]const u8) = .empty;
24
24
+
for (service_dirs.items) |dir_path| {
25
25
+
const dir = std.fs.openDirAbsoluteZ(dir_path, .{ .iterate = true }) catch |e| {
26
26
+
if (e == error.FileNotFound) continue;
27
27
+
return e;
28
28
+
};
29
29
+
var iter = dir.iterate();
30
30
+
while (try iter.next()) |entry| {
31
31
+
// std.log.info("{s}/{s}", .{ dir_path, entry.name });
32
32
+
if (entry.kind == .file and !services.contains(entry.name)) {
33
33
+
try services.put(a, try a.dupe(u8, entry.name), try std.fmt.allocPrintZ(a, "{s}/{s}", .{ dir_path, entry.name }));
34
34
+
}
35
35
+
}
36
36
+
}
37
37
+
38
38
+
const stdout = std.io.getStdOut();
39
39
+
var longest: usize = 0;
40
40
+
var iter = services.iterator();
41
41
+
while (iter.next()) |entry| {
42
42
+
longest = @max(longest, entry.key_ptr.len);
43
43
+
}
44
44
+
const pad_buffer: [36]u8 = @splat(' ');
45
45
+
iter = services.iterator();
46
46
+
while (iter.next()) |entry| {
47
47
+
const pad = pad_buffer[0 .. longest + 4 - entry.key_ptr.len];
48
48
+
try stdout.writer().print("{s}{s}{s}\n", .{ entry.key_ptr.*, pad, entry.value_ptr.* });
49
49
+
}
50
50
+
}
+5
readme.md
reviewed
···
1
1
+
list all dinit service files
2
2
+
3
3
+
```
4
4
+
zig build-exe main.zig
5
5
+
```