A CLI tool to edit dinit service files with ease
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

++

iacore 1d75ab75 e091c4d1

+26 -2
+1
.gitignore
··· 1 + *.o
+23 -2
main.zig
··· 2 2 3 3 const a = std.heap.smp_allocator; 4 4 5 + var service_dirs: std.ArrayListUnmanaged([:0]const u8) = .empty; 6 + 7 + var services: std.StringArrayHashMapUnmanaged([:0]const u8) = .empty; 8 + 5 9 pub fn main() !void { 10 + try load_definitions(); 11 + 12 + if (std.os.argv.len == 1) try list_all(); 13 + if (std.os.argv.len == 2) try edit(std.mem.span(std.os.argv[1])); 14 + } 15 + 16 + pub fn load_definitions() !void { 6 17 const uid = std.posix.system.getuid(); 7 18 8 - var service_dirs: std.ArrayListUnmanaged([:0]const u8) = .empty; 9 19 if (uid == 0) { 10 20 var default_system = [_][:0]const u8{ "/etc/dinit.d", "/run/dinit.d", "/usr/local/lib/dinit.d", "/lib/dinit.d" }; 11 21 service_dirs = .fromOwnedSlice(&default_system); ··· 20 30 service_dirs.appendSliceAssumeCapacity(&.{ "/etc/dinit.d/user", "/usr/lib/dinit.d/user", "/usr/local/lib/dinit.d/user" }); 21 31 } 22 32 23 - var services: std.StringArrayHashMapUnmanaged([:0]const u8) = .empty; 24 33 for (service_dirs.items) |dir_path| { 25 34 const dir = std.fs.openDirAbsoluteZ(dir_path, .{ .iterate = true }) catch |e| { 26 35 if (e == error.FileNotFound) continue; ··· 34 43 } 35 44 } 36 45 } 46 + } 37 47 48 + fn list_all() !void { 38 49 const stdout = std.io.getStdOut(); 39 50 var longest: usize = 0; 40 51 var iter = services.iterator(); ··· 48 59 try stdout.writer().print("{s}{s}{s}\n", .{ entry.key_ptr.*, pad, entry.value_ptr.* }); 49 60 } 50 61 } 62 + 63 + fn edit(service_name: []const u8) !void { 64 + const editor = std.posix.getenvZ("EDITOR") orelse "/usr/bin/kak"; 65 + var iter = services.iterator(); 66 + while (iter.next()) |entry| { 67 + if (std.mem.eql(u8, entry.key_ptr.*, service_name)) { 68 + return std.posix.execvpeZ(editor, &.{ editor, entry.value_ptr.* }, @ptrCast(std.os.environ)); 69 + } 70 + } 71 + }
+2
readme.md
··· 1 1 list all dinit service files 2 2 3 3 ``` 4 + zig run main.zig 4 5 zig build-exe main.zig 6 + zig build-exe -O ReleaseSafe main.zig 5 7 ```