diff --git a/build.zig.zon b/build.zig.zon index efa94ad..c031faf 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,10 +1,13 @@ .{ - .name = "crash", + .name = .crash, .version = "0.0.1", + .fingerprint = 0xd7e8f0df85300b08, - .minimum_zig_version = "0.12.0", + .minimum_zig_version = "0.14.0", .paths = .{ - "", + "src/main.zig", + "build.zig", + "build.zig.zon", }, } diff --git a/flake.lock b/flake.lock index 2062d0b..31f03a6 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1715653339, - "narHash": "sha256-7lR9tpVXviSccl07GXI0+ve/natd24HAkuy1sQp0OlI=", + "lastModified": 1744442362, + "narHash": "sha256-i47t4DRIZgwBZw2Osbrp1OJhhO1k/n+QzRx+TrmfE9Y=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "abd6d48f8c77bea7dc51beb2adfa6ed3950d2585", + "rev": "2349f9de17183971db12ae9e0123dab132023bd7", "type": "github" }, "original": { diff --git a/package.nix b/package.nix index 02765f8..faeecdb 100644 --- a/package.nix +++ b/package.nix @@ -34,7 +34,7 @@ in stdenvNoCC.mkDerivation { homepage = "https://github.com/RGBCube/crash"; license = licenses.mit; mainProgram = "crash"; - platforms = platforms.linux; + platforms = platforms.unix; maintainers = with maintainers; [ RGBCube ]; }; } diff --git a/src/main.zig b/src/main.zig index 8f96461..f86e032 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,8 +1,8 @@ const std = @import("std"); const fallback_shell = @import("build_options").fallback_shell orelse @compileError("fallback shell was not specified"); -pub fn fallback(alloc: std.mem.Allocator) noreturn { - const err = std.process.execv(alloc, &[_][]const u8{fallback_shell}); +pub fn fallback(alloc: std.mem.Allocator, args: []const []const u8) noreturn { + const err = std.process.execv(alloc, args); std.process.exit(@intCast(@intFromError(err))); } @@ -10,28 +10,37 @@ pub fn main() noreturn { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; const alloc = gpa.allocator(); - var args = alloc.alloc([]const u8, std.os.argv.len) catch fallback(alloc); + var args = alloc.alloc([]const u8, std.os.argv.len) catch fallback(alloc, &[_][]const u8{fallback_shell}); defer alloc.free(args); args.len = 0; var argi = std.process.args(); while (argi.next()) |arg| { - args.len += 1; - args[args.len - 1] = arg; + defer args.len += 1; + args[args.len] = arg; } - const shells = std.posix.getenv("SHELLS") orelse fallback(alloc); + const shells = std.posix.getenv("SHELLS") orelse fallback(alloc, args: { + args[0] = fallback_shell; + break :args args; + }); - var it = std.mem.split(u8, shells, ":"); + var it = std.mem.splitScalar(u8, shells, ':'); while (it.next()) |shell| { args[0] = shell; var child = std.process.Child.init(args, alloc); - switch (child.spawnAndWait() catch fallback(alloc)) { + switch (child.spawnAndWait() catch fallback(alloc, args: { + args[0] = fallback_shell; + break :args args; + })) { std.process.Child.Term.Exited => |exit_code| if (exit_code == 0) std.process.exit(0), else => continue, } } - fallback(alloc); + fallback(alloc, args: { + args[0] = fallback_shell; + break :args args; + }); }