diff --git a/src/auth.zig b/src/auth.zig index 22b5abe..7544352 100644 --- a/src/auth.zig +++ b/src/auth.zig @@ -305,7 +305,7 @@ fn getXPid(display_num: u8) !i32 { return std.fmt.parseInt(i32, std.mem.trim(u8, buffer[0..written], " "), 10); } -fn createXauthFile(pwd: [:0]const u8) ![]const u8 { +fn createXauthFile(pwd: []const u8) ![]const u8 { var xauth_buf: [100]u8 = undefined; var xauth_dir: []const u8 = undefined; const xdg_rt_dir = std.posix.getenv("XDG_RUNTIME_DIR"); @@ -365,11 +365,8 @@ fn mcookie() [Md5.digest_length * 2]u8 { return std.fmt.bytesToHex(&out, .lower); } -fn xauth(log_writer: *std.Io.Writer, allocator: std.mem.Allocator, display_name: []u8, shell: [*:0]const u8, pw_dir: [*:0]const u8, options: AuthOptions) !void { - var pwd_buf: [100]u8 = undefined; - const pwd = try std.fmt.bufPrintZ(&pwd_buf, "{s}", .{pw_dir}); - - const xauthority = try createXauthFile(pwd); +fn xauth(log_writer: *std.Io.Writer, allocator: std.mem.Allocator, display_name: []u8, shell: [*:0]const u8, home: []const u8, options: AuthOptions) !void { + const xauthority = try createXauthFile(home); try interop.setEnvironmentVariable(allocator, "XAUTHORITY", xauthority, true); try interop.setEnvironmentVariable(allocator, "DISPLAY", display_name, true); @@ -379,6 +376,7 @@ fn xauth(log_writer: *std.Io.Writer, allocator: std.mem.Allocator, display_name: if (pid == 0) { var cmd_buffer: [1024]u8 = undefined; const cmd_str = std.fmt.bufPrintZ(&cmd_buffer, "{s} add {s} . {s}", .{ options.xauth_cmd, display_name, magic_cookie }) catch std.process.exit(1); + const args = [_:null]?[*:0]const u8{ shell, "-c", cmd_str }; std.posix.execveZ(shell, &args, std.c.environ) catch {}; std.process.exit(1); @@ -399,6 +397,7 @@ fn executeShellCmd(allocator: std.mem.Allocator, shell: []const u8, options: Aut var cmd_buffer: [1024]u8 = undefined; const cmd_str = try std.fmt.bufPrintZ(&cmd_buffer, "{s} {s} {s}", .{ options.setup_cmd, options.login_cmd orelse "", shell }); + const args = [_:null]?[*:0]const u8{ shell_z, "-c", cmd_str }; return std.posix.execveZ(shell_z, &args, std.c.environ); } @@ -415,6 +414,7 @@ fn executeWaylandCmd(log_writer: *std.Io.Writer, allocator: std.mem.Allocator, s var cmd_buffer: [1024]u8 = undefined; const cmd_str = try std.fmt.bufPrintZ(&cmd_buffer, "{s} {s} {s}", .{ options.setup_cmd, options.login_cmd orelse "", desktop_cmd }); + const args = [_:null]?[*:0]const u8{ shell_z, "-c", cmd_str }; return std.posix.execveZ(shell_z, &args, std.c.environ); } @@ -427,15 +427,13 @@ fn executeX11Cmd(log_writer: *std.Io.Writer, allocator: std.mem.Allocator, shell const shell_z = try allocator.dupeZ(u8, shell); defer allocator.free(shell_z); - const home_z = try allocator.dupeZ(u8, home); - defer allocator.free(home_z); - - try xauth(log_writer, allocator, display_name, shell_z, home_z, options); + try xauth(log_writer, allocator, display_name, shell_z, home, options); const pid = try std.posix.fork(); if (pid == 0) { var cmd_buffer: [1024]u8 = undefined; const cmd_str = std.fmt.bufPrintZ(&cmd_buffer, "{s} {s} {s}", .{ options.x_cmd, display_name, vt }) catch std.process.exit(1); + const args = [_:null]?[*:0]const u8{ shell_z, "-c", cmd_str }; std.posix.execveZ(shell_z, &args, std.c.environ) catch {}; std.process.exit(1); @@ -459,6 +457,7 @@ fn executeX11Cmd(log_writer: *std.Io.Writer, allocator: std.mem.Allocator, shell if (xorg_pid == 0) { var cmd_buffer: [1024]u8 = undefined; const cmd_str = std.fmt.bufPrintZ(&cmd_buffer, "{s} {s} {s}", .{ options.setup_cmd, options.login_cmd orelse "", desktop_cmd }) catch std.process.exit(1); + const args = [_:null]?[*:0]const u8{ shell_z, "-c", cmd_str }; std.posix.execveZ(shell_z, &args, std.c.environ) catch {}; std.process.exit(1); @@ -500,6 +499,7 @@ fn executeCustomCmd(log_writer: *std.Io.Writer, allocator: std.mem.Allocator, sh var cmd_buffer: [1024]u8 = undefined; const cmd_str = try std.fmt.bufPrintZ(&cmd_buffer, "{s} {s} {s}", .{ options.setup_cmd, options.login_cmd orelse "", exec_cmd }); + const args = [_:null]?[*:0]const u8{ shell_z, "-c", cmd_str }; return std.posix.execveZ(shell_z, &args, std.c.environ); } diff --git a/src/interop.zig b/src/interop.zig index d58eeec..940c297 100644 --- a/src/interop.zig +++ b/src/interop.zig @@ -187,7 +187,7 @@ pub fn setUserShell(entry: *UsernameEntry) void { unistd.setusershell(); const shell = unistd.getusershell(); - entry.shell = shell[0..std.mem.len(shell)]; + entry.shell = std.mem.span(shell); unistd.endusershell(); } @@ -213,11 +213,11 @@ pub fn getNextUsernameEntry() ?UsernameEntry { if (entry == null) return null; return .{ - .username = if (entry.*.pw_name) |name| name[0..std.mem.len(name)] else null, + .username = if (entry.*.pw_name) |name| std.mem.span(name) else null, .uid = @intCast(entry.*.pw_uid), .gid = @intCast(entry.*.pw_gid), - .home = if (entry.*.pw_dir) |dir| dir[0..std.mem.len(dir)] else null, - .shell = if (entry.*.pw_shell) |shell| shell[0..std.mem.len(shell)] else null, + .home = if (entry.*.pw_dir) |dir| std.mem.span(dir) else null, + .shell = if (entry.*.pw_shell) |shell| std.mem.span(shell) else null, .passwd_struct = entry, }; } @@ -227,11 +227,11 @@ pub fn getUsernameEntry(username: [:0]const u8) ?UsernameEntry { if (entry == null) return null; return .{ - .username = if (entry.*.pw_name) |name| name[0..std.mem.len(name)] else null, + .username = if (entry.*.pw_name) |name| std.mem.span(name) else null, .uid = @intCast(entry.*.pw_uid), .gid = @intCast(entry.*.pw_gid), - .home = if (entry.*.pw_dir) |dir| dir[0..std.mem.len(dir)] else null, - .shell = if (entry.*.pw_shell) |shell| shell[0..std.mem.len(shell)] else null, + .home = if (entry.*.pw_dir) |dir| std.mem.span(dir) else null, + .shell = if (entry.*.pw_shell) |shell| std.mem.span(shell) else null, .passwd_struct = entry, }; } diff --git a/src/main.zig b/src/main.zig index ef02fa7..2abce0b 100644 --- a/src/main.zig +++ b/src/main.zig @@ -965,7 +965,7 @@ pub fn main() !void { fn ttyClearScreen() !void { // Clear the TTY because termbox2 doesn't seem to do it properly const capability = termbox.global.caps[termbox.TB_CAP_CLEAR_SCREEN]; - const capability_slice = capability[0..std.mem.len(capability)]; + const capability_slice = std.mem.span(capability); _ = try std.posix.write(termbox.global.ttyfd, capability_slice); }