From 815b917b6f572bf7427b58c32546a764b83df256 Mon Sep 17 00:00:00 2001 From: Kinzie Date: Sun, 21 Apr 2024 07:27:14 +0100 Subject: [PATCH] Update to zig version 0.12.0 --- build.zig | 6 +- build.zig.zon | 9 +- res/lang/en.ini | 1 + src/SharedError.zig | 4 +- src/auth.zig | 228 ++++++++++++++------------------- src/config/Lang.zig | 1 + src/config/migrator.zig | 2 +- src/interop.zig | 50 +------- src/main.zig | 93 +++++--------- src/tui/components/Desktop.zig | 2 +- 10 files changed, 148 insertions(+), 248 deletions(-) diff --git a/build.zig b/build.zig index 6ac8a4e..13c5140 100644 --- a/build.zig +++ b/build.zig @@ -35,12 +35,12 @@ pub fn build(b: *std.Build) void { }); const zigini = b.dependency("zigini", .{ .target = target, .optimize = optimize }); - exe.addModule("zigini", zigini.module("zigini")); + exe.root_module.addImport("zigini", zigini.module("zigini")); - exe.addOptions("build_options", build_options); + exe.root_module.addOptions("build_options", build_options); const clap = b.dependency("clap", .{ .target = target, .optimize = optimize }); - exe.addModule("clap", clap.module("clap")); + exe.root_module.addImport("clap", clap.module("clap")); exe.linkSystemLibrary("pam"); exe.linkSystemLibrary("xcb"); diff --git a/build.zig.zon b/build.zig.zon index c7830cf..b7606a4 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -3,12 +3,13 @@ .version = "1.0.0", .dependencies = .{ .clap = .{ - .url = "https://github.com/Hejsil/zig-clap/archive/f49b94700e0761b7514abdca0e4f0e7f3f938a93.tar.gz", - .hash = "1220f48518ce22882e102255ed3bcdb7aeeb4891f50b2cdd3bd74b5b2e24d3149ba2", + .url = "https://github.com/Hejsil/zig-clap/archive/8c98e6404b22aafc0184e999d8f068b81cc22fa1.tar.gz", + .hash = "122014e73fd712190e109950837b97f6143f02d7e2b6986e1db70b6f4aadb5ba6a0d", }, .zigini = .{ - .url = "https://github.com/Kawaii-Ash/zigini/archive/e2d2bbfe1863346ad1fc6c845ce719a6eab200ab.tar.gz", - .hash = "1220f2b545cafa2b8688a69eff10b7d71e2f2ee5d9b119c4b74c873f36b4b2117157", + .url = "https://github.com/Kawaii-Ash/zigini/archive/a5b5caf43f0a0246a242df4aebd00a0649deebad.tar.gz", + .hash = "12202e097a54cbb7c002a2a5b3a3435939fa3902cd14308b7b66ab710e3d88d76e94", }, }, + .paths = .{""}, } diff --git a/res/lang/en.ini b/res/lang/en.ini index 1dc98d4..766dc86 100644 --- a/res/lang/en.ini +++ b/res/lang/en.ini @@ -29,6 +29,7 @@ err_perm_dir = failed to change current directory err_perm_group = failed to downgrade group permissions err_perm_user = failed to downgrade user permissions err_pwnam = failed to get user info +err_unknown = an unknown error occurred err_user_gid = failed to set user GID err_user_init = failed to initialize user err_user_uid = failed to set user UID diff --git a/src/SharedError.zig b/src/SharedError.zig index fa02100..04b1fa3 100644 --- a/src/SharedError.zig +++ b/src/SharedError.zig @@ -12,13 +12,13 @@ const SharedError = @This(); data: []align(std.mem.page_size) u8, pub fn init() !SharedError { - const data = try std.os.mmap(null, @sizeOf(ErrorHandler), std.os.PROT.READ | std.os.PROT.WRITE, std.os.MAP.SHARED | std.os.MAP.ANONYMOUS, -1, 0); + const data = try std.posix.mmap(null, @sizeOf(ErrorHandler), std.posix.PROT.READ | std.posix.PROT.WRITE, .{ .TYPE = .SHARED, .ANONYMOUS = true }, -1, 0); return .{ .data = data }; } pub fn deinit(self: *SharedError) void { - defer std.os.munmap(self.data); + defer std.posix.munmap(self.data); } pub fn writeError(self: SharedError, err: anyerror) void { diff --git a/src/auth.zig b/src/auth.zig index 23f38aa..1c2bfac 100644 --- a/src/auth.zig +++ b/src/auth.zig @@ -10,12 +10,12 @@ const utmp = interop.utmp; const Utmp = utmp.utmp; const SharedError = @import("SharedError.zig"); -var xorg_pid: std.os.pid_t = 0; +var xorg_pid: std.posix.pid_t = 0; pub fn xorgSignalHandler(i: c_int) callconv(.C) void { if (xorg_pid > 0) _ = std.c.kill(xorg_pid, i); } -var child_pid: std.os.pid_t = 0; +var child_pid: std.posix.pid_t = 0; pub fn sessionSignalHandler(i: c_int) callconv(.C) void { if (child_pid > 0) _ = std.c.kill(child_pid, i); } @@ -54,120 +54,46 @@ pub fn authenticate(config: Config, desktop: Desktop, login: [:0]const u8, passw status = interop.pam.pam_open_session(handle, 0); if (status != interop.pam.PAM_SUCCESS) return pamDiagnose(status); - // Get password structure from username - const maybe_pwd = interop.getpwnam(login.ptr); - interop.endpwent(); + var pwd: *interop.passwd = undefined; + { + defer interop.endpwent(); - if (maybe_pwd == null) return error.GetPasswordNameFailed; - const pwd = maybe_pwd.?; + // Get password structure from username + pwd = interop.getpwnam(login.ptr) orelse return error.GetPasswordNameFailed; + } // Set user shell if it hasn't already been set if (pwd.pw_shell[0] == 0) { interop.setusershell(); - defer interop.endusershell(); - - const shell = interop.getusershell(); - - if (shell[0] != 0) { - var index: usize = 0; - - while (true) : (index += 1) { - const char = shell[index]; - pwd.pw_shell[index] = char; - - if (char == 0) break; - } - } + pwd.pw_shell = interop.getusershell(); + interop.endusershell(); } var shared_err = try SharedError.init(); defer shared_err.deinit(); - child_pid = try std.os.fork(); + child_pid = try std.posix.fork(); if (child_pid == 0) { - // Set the user information - status = interop.initgroups(pwd.pw_name, pwd.pw_gid); - if (status != 0) { - shared_err.writeError(error.GroupInitializationFailed); - std.os.exit(1); - } - - status = std.c.setgid(pwd.pw_gid); - if (status != 0) { - shared_err.writeError(error.SetUserGidFailed); - std.os.exit(1); - } - - status = std.c.setuid(pwd.pw_uid); - if (status != 0) { - shared_err.writeError(error.SetUserUidFailed); - std.os.exit(1); - } - - // Set up the environment - initEnv(pwd, config.path) catch |e| { + startSession(config, pwd, handle, current_environment) catch |e| { shared_err.writeError(e); - std.os.exit(1); + std.process.exit(1); }; - - // Set the PAM variables - const pam_env_vars = interop.pam.pam_getenvlist(handle); - var index: usize = 0; - - while (true) : (index += 1) { - const pam_env_var = pam_env_vars[index]; - if (pam_env_var == null) break; - - _ = interop.putenv(pam_env_var); - } - - // Execute what the user requested - status = interop.chdir(pwd.pw_dir); - if (status != 0) { - shared_err.writeError(error.ChangeDirectoryFailed); - std.os.exit(1); - } - - resetTerminal(pwd.pw_shell, config.term_reset_cmd) catch |e| { - shared_err.writeError(e); - std.os.exit(1); - }; - - switch (current_environment.display_server) { - .wayland => executeWaylandCmd(pwd.pw_shell, config.wayland_cmd, current_environment.cmd) catch |e| { - shared_err.writeError(e); - std.os.exit(1); - }, - .shell => executeShellCmd(pwd.pw_shell), - .xinitrc, .x11 => { - var vt_buf: [5]u8 = undefined; - const vt = std.fmt.bufPrint(&vt_buf, "vt{d}", .{config.tty}) catch |e| { - shared_err.writeError(e); - std.os.exit(1); - }; - executeX11Cmd(pwd.pw_shell, pwd.pw_dir, config, current_environment.cmd, vt) catch |e| { - shared_err.writeError(e); - std.os.exit(1); - }; - }, - } - - std.os.exit(0); + std.process.exit(0); } var entry: Utmp = std.mem.zeroes(Utmp); addUtmpEntry(&entry, pwd.pw_name, child_pid) catch {}; // If we receive SIGTERM, forward it to child_pid - const act = std.os.Sigaction{ + const act = std.posix.Sigaction{ .handler = .{ .handler = &sessionSignalHandler }, - .mask = std.os.empty_sigset, + .mask = std.posix.empty_sigset, .flags = 0, }; - try std.os.sigaction(std.os.SIG.TERM, &act, null); + try std.posix.sigaction(std.posix.SIG.TERM, &act, null); // Wait for the session to stop - _ = std.os.waitpid(child_pid, 0); + _ = std.posix.waitpid(child_pid, 0); removeUtmpEntry(&entry); @@ -186,8 +112,51 @@ pub fn authenticate(config: Config, desktop: Desktop, login: [:0]const u8, passw if (shared_err.readError()) |err| return err; } +fn startSession( + config: Config, + pwd: *interop.passwd, + handle: ?*interop.pam.pam_handle, + current_environment: Desktop.Environment, +) !void { + var status: c_int = 0; + status = interop.initgroups(pwd.pw_name, pwd.pw_gid); + if (status != 0) return error.GroupInitializationFailed; + + std.posix.setgid(pwd.pw_gid) catch return error.SetUserGidFailed; + std.posix.setuid(pwd.pw_uid) catch return error.SetUserUidFailed; + + // Set up the environment + try initEnv(pwd, config.path); + + // Set the PAM variables + const pam_env_vars = interop.pam.pam_getenvlist(handle); + + var index: usize = 0; + while (true) : (index += 1) { + const pam_env_var = pam_env_vars[index]; + if (pam_env_var == null) break; + + _ = interop.putenv(pam_env_var); + } + + // Execute what the user requested + std.posix.chdirZ(pwd.pw_dir) catch return error.ChangeDirectoryFailed; + + try resetTerminal(pwd.pw_shell, config.term_reset_cmd); + + switch (current_environment.display_server) { + .wayland => try executeWaylandCmd(pwd.pw_shell, config.wayland_cmd, current_environment.cmd), + .shell => executeShellCmd(pwd.pw_shell), + .xinitrc, .x11 => { + var vt_buf: [5]u8 = undefined; + const vt = try std.fmt.bufPrint(&vt_buf, "vt{d}", .{config.tty}); + try executeX11Cmd(pwd.pw_shell, pwd.pw_dir, config, current_environment.cmd, vt); + }, + } +} + fn initEnv(pwd: *interop.passwd, path_env: ?[:0]const u8) !void { - const term_env = std.os.getenv("TERM"); + const term_env = std.posix.getenv("TERM"); if (term_env) |term| _ = interop.setenv("TERM", term, 1); _ = interop.setenv("HOME", pwd.pw_dir, 1); @@ -273,13 +242,13 @@ fn loginConv( } fn resetTerminal(shell: [*:0]const u8, term_reset_cmd: [:0]const u8) !void { - const pid = try std.os.fork(); + const pid = try std.posix.fork(); if (pid == 0) { _ = interop.execl(shell, shell, "-c", term_reset_cmd.ptr); - std.os.exit(0); + std.process.exit(0); } - _ = std.os.waitpid(pid, 0); + _ = std.posix.waitpid(pid, 0); } fn getFreeDisplay() !u8 { @@ -287,7 +256,7 @@ fn getFreeDisplay() !u8 { var i: u8 = 0; while (i < 200) : (i += 1) { const xlock = try std.fmt.bufPrint(&buf, "/tmp/.X{d}-lock", .{i}); - std.os.access(xlock, std.os.F_OK) catch break; + std.posix.access(xlock, std.posix.F_OK) catch break; } return i; } @@ -310,17 +279,17 @@ fn getXPid(display_num: u8) !i32 { fn createXauthFile(pwd: [:0]const u8) ![:0]const u8 { var xauth_buf: [100]u8 = undefined; var xauth_dir: [:0]const u8 = undefined; - var xdg_rt_dir = std.os.getenv("XDG_RUNTIME_DIR"); + const xdg_rt_dir = std.posix.getenv("XDG_RUNTIME_DIR"); var xauth_file: []const u8 = "lyxauth"; if (xdg_rt_dir == null) { - const xdg_cfg_home = std.os.getenv("XDG_CONFIG_HOME"); + const xdg_cfg_home = std.posix.getenv("XDG_CONFIG_HOME"); var sb: std.c.Stat = undefined; if (xdg_cfg_home == null) { xauth_dir = try std.fmt.bufPrintZ(&xauth_buf, "{s}/.config", .{pwd}); _ = std.c.stat(xauth_dir, &sb); - const mode = sb.mode & std.os.S.IFMT; - if (mode == std.os.S.IFDIR) { + const mode = sb.mode & std.posix.S.IFMT; + if (mode == std.posix.S.IFDIR) { xauth_dir = try std.fmt.bufPrintZ(&xauth_buf, "{s}/ly", .{xauth_dir}); } else { xauth_dir = pwd; @@ -331,9 +300,9 @@ fn createXauthFile(pwd: [:0]const u8) ![:0]const u8 { } _ = std.c.stat(xauth_dir, &sb); - const mode = sb.mode & std.os.S.IFMT; - if (mode != std.os.S.IFDIR) { - std.os.mkdir(xauth_dir, 777) catch { + const mode = sb.mode & std.posix.S.IFMT; + if (mode != std.posix.S.IFDIR) { + std.posix.mkdir(xauth_dir, 777) catch { xauth_dir = pwd; xauth_file = ".lyxauth"; }; @@ -349,7 +318,7 @@ fn createXauthFile(pwd: [:0]const u8) ![:0]const u8 { var buf: [256]u8 = undefined; const xauthority: [:0]u8 = try std.fmt.bufPrintZ(&buf, "{s}/{s}", .{ trimmed_xauth_dir, xauth_file }); - const file = try std.fs.createFileAbsolute(xauthority, .{}); + const file = try std.fs.createFileAbsoluteZ(xauthority, .{}); // FileNotFound file.close(); return xauthority; @@ -357,21 +326,21 @@ fn createXauthFile(pwd: [:0]const u8) ![:0]const u8 { fn xauth(display_name: [:0]u8, shell: [*:0]const u8, pw_dir: [*:0]const u8, xauth_cmd: []const u8, mcookie_cmd: []const u8) !void { var pwd_buf: [100]u8 = undefined; - var pwd = try std.fmt.bufPrintZ(&pwd_buf, "{s}", .{pw_dir}); + const pwd = try std.fmt.bufPrintZ(&pwd_buf, "{s}", .{pw_dir}); const xauthority = try createXauthFile(pwd); _ = interop.setenv("XAUTHORITY", xauthority, 1); _ = interop.setenv("DISPLAY", display_name, 1); - const pid = try std.os.fork(); + const pid = try std.posix.fork(); if (pid == 0) { var cmd_buffer: [1024]u8 = undefined; - const cmd_str = std.fmt.bufPrintZ(&cmd_buffer, "{s} add {s} . $({s})", .{ xauth_cmd, display_name, mcookie_cmd }) catch std.os.exit(1); + const cmd_str = std.fmt.bufPrintZ(&cmd_buffer, "{s} add {s} . $({s})", .{ xauth_cmd, display_name, mcookie_cmd }) catch std.process.exit(1); _ = interop.execl(shell, shell, "-c", cmd_str.ptr); - std.os.exit(0); + std.process.exit(0); } - _ = std.os.waitpid(pid, 0); + _ = std.posix.waitpid(pid, 0); } fn executeWaylandCmd(shell: [*:0]const u8, wayland_cmd: []const u8, desktop_cmd: []const u8) !void { @@ -384,55 +353,56 @@ fn executeWaylandCmd(shell: [*:0]const u8, wayland_cmd: []const u8, desktop_cmd: fn executeX11Cmd(shell: [*:0]const u8, pw_dir: [*:0]const u8, config: Config, desktop_cmd: []const u8, vt: []const u8) !void { const display_num = try getFreeDisplay(); var buf: [5]u8 = undefined; - var display_name = try std.fmt.bufPrintZ(&buf, ":{d}", .{display_num}); + const display_name = try std.fmt.bufPrintZ(&buf, ":{d}", .{display_num}); try xauth(display_name, shell, pw_dir, config.xauth_cmd, config.mcookie_cmd); - const pid = try std.os.fork(); + 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}", .{ config.x_cmd, display_name, vt }) catch std.os.exit(1); + const cmd_str = std.fmt.bufPrintZ(&cmd_buffer, "{s} {s} {s}", .{ config.x_cmd, display_name, vt }) catch std.process.exit(1); _ = interop.execl(shell, shell, "-c", cmd_str.ptr); - std.os.exit(0); + std.process.exit(0); } - var status: c_int = 0; var ok: c_int = undefined; var xcb: ?*interop.xcb.xcb_connection_t = null; while (ok != 0) { xcb = interop.xcb.xcb_connect(null, null); ok = interop.xcb.xcb_connection_has_error(xcb); - status = std.c.kill(pid, 0); - if (std.os.errno(status) == .SRCH and ok != 0) return; + std.posix.kill(pid, 0) catch |e| { + if (e == error.ProcessNotFound and ok != 0) return; + }; } // X Server detaches from the process. // PID can be fetched from /tmp/X{d}.lock const x_pid = try getXPid(display_num); - xorg_pid = try std.os.fork(); + xorg_pid = try std.posix.fork(); if (xorg_pid == 0) { var cmd_buffer: [1024]u8 = undefined; - const cmd_str = std.fmt.bufPrintZ(&cmd_buffer, "{s} {s}", .{ config.x_cmd_setup, desktop_cmd }) catch std.os.exit(1); + const cmd_str = std.fmt.bufPrintZ(&cmd_buffer, "{s} {s}", .{ config.x_cmd_setup, desktop_cmd }) catch std.process.exit(1); _ = interop.execl(shell, shell, "-c", cmd_str.ptr); - std.os.exit(0); + std.process.exit(0); } // If we receive SIGTERM, clean up by killing the xorg_pid process - const act = std.os.Sigaction{ + const act = std.posix.Sigaction{ .handler = .{ .handler = &xorgSignalHandler }, - .mask = std.os.empty_sigset, + .mask = std.posix.empty_sigset, .flags = 0, }; - try std.os.sigaction(std.os.SIG.TERM, &act, null); + try std.posix.sigaction(std.posix.SIG.TERM, &act, null); - _ = std.os.waitpid(xorg_pid, 0); + _ = std.posix.waitpid(xorg_pid, 0); interop.xcb.xcb_disconnect(xcb); - status = std.c.kill(x_pid, 0); - if (std.os.errno(status) != .SRCH) { - _ = std.c.kill(x_pid, std.os.SIG.TERM); - _ = std.c.waitpid(x_pid, &status, 0); - } + std.posix.kill(x_pid, 0) catch return; + + std.posix.kill(x_pid, std.posix.SIG.TERM) catch {}; + + var status: c_int = 0; + _ = std.c.waitpid(x_pid, &status, 0); } fn executeShellCmd(shell: [*:0]const u8) void { diff --git a/src/config/Lang.zig b/src/config/Lang.zig index 7ebe0b0..0333e0b 100644 --- a/src/config/Lang.zig +++ b/src/config/Lang.zig @@ -29,6 +29,7 @@ err_perm_dir: []const u8 = "failed to change current directory", err_perm_group: []const u8 = "failed to downgrade group permissions", err_perm_user: []const u8 = "failed to downgrade user permissions", err_pwnam: []const u8 = "failed to get user info", +err_unknown: []const u8 = "an unknown error occurred", err_user_gid: []const u8 = "failed to set user GID", err_user_init: []const u8 = "failed to initialize user", err_user_uid: []const u8 = "failed to set user UID", diff --git a/src/config/migrator.zig b/src/config/migrator.zig index 5ea4da6..b41128c 100644 --- a/src/config/migrator.zig +++ b/src/config/migrator.zig @@ -12,7 +12,7 @@ pub fn tryMigrateSaveFile(user_buf: *[32]u8, old_path: []const u8, new_path: []c var user_fbs = std.io.fixedBufferStream(user_buf); reader.streamUntilDelimiter(user_fbs.writer(), '\n', 32) catch return save; - var user = user_fbs.getWritten(); + const user = user_fbs.getWritten(); if (user.len > 0) save.user = user; var session_buf: [20]u8 = undefined; diff --git a/src/interop.zig b/src/interop.zig index c193c7d..e1b6fa1 100644 --- a/src/interop.zig +++ b/src/interop.zig @@ -44,9 +44,6 @@ pub const passwd = extern struct { pw_shell: [*:0]u8, }; -pub const _POSIX_HOST_NAME_MAX: c_int = 0xFF; -pub const _SC_HOST_NAME_MAX: c_int = 0xB4; - pub const VT_ACTIVATE: c_int = 0x5606; pub const VT_WAITACTIVE: c_int = 0x5607; @@ -59,19 +56,11 @@ pub const LED_CAP: c_int = 0x04; pub const K_NUMLOCK: c_int = 0x02; pub const K_CAPSLOCK: c_int = 0x04; -pub const O_RDONLY: c_uint = 0x00; -pub const O_WRONLY: c_uint = 0x01; -pub const O_RDWR: c_uint = 0x02; - -pub extern "c" fn fileno(stream: *std.c.FILE) c_int; -pub extern "c" fn sysconf(name: c_int) c_long; pub extern "c" fn time(second: ?*c_time) c_time; pub extern "c" fn localtime(timer: *const c_time) *tm; pub extern "c" fn strftime(str: [*:0]u8, maxsize: c_size, format: [*:0]const u8, timeptr: *const tm) c_size; pub extern "c" fn setenv(name: [*:0]const u8, value: [*:0]const u8, overwrite: c_int) c_int; -pub extern "c" fn getenv(name: [*:0]const u8) [*:0]u8; pub extern "c" fn putenv(name: [*:0]u8) c_int; -pub extern "c" fn clearenv() c_int; pub extern "c" fn getuid() c_uid; pub extern "c" fn getpwnam(name: [*:0]const u8) ?*passwd; pub extern "c" fn endpwent() void; @@ -79,52 +68,23 @@ pub extern "c" fn setusershell() void; pub extern "c" fn getusershell() [*:0]u8; pub extern "c" fn endusershell() void; pub extern "c" fn initgroups(user: [*:0]const u8, group: c_gid) c_int; -pub extern "c" fn chdir(path: [*:0]const u8) c_int; pub extern "c" fn execl(path: [*:0]const u8, arg: [*:0]const u8, ...) c_int; -pub fn getHostName(allocator: Allocator) !struct { - buffer: []u8, - slice: []const u8, -} { - const hostname_sysconf = sysconf(_SC_HOST_NAME_MAX); - const hostname_max_length: u64 = if (hostname_sysconf < 0) @intCast(_POSIX_HOST_NAME_MAX) else @intCast(hostname_sysconf); - - const buffer = try allocator.alloc(u8, hostname_max_length); - errdefer allocator.free(buffer); - - const error_code = std.c.gethostname(buffer.ptr, hostname_max_length); - if (error_code < 0) return error.CannotGetHostName; - - var hostname_length: u64 = 0; - for (buffer, 0..) |char, i| { - if (char == 0) { - hostname_length = i + 1; - break; - } - } - - return .{ - .buffer = buffer, - .slice = buffer[0..hostname_length], - }; -} - -pub fn timeAsString(allocator: Allocator, format: [:0]const u8, max_length: u64) ![:0]u8 { +pub fn timeAsString(buf: [:0]u8, format: [:0]const u8) ![]u8 { const timer = time(null); const tm_info = localtime(&timer); - const buffer = try allocator.allocSentinel(u8, max_length, 0); - errdefer allocator.free(buffer); - if (strftime(buffer, max_length, format, tm_info) < 0) return error.CannotGetFormattedTime; + const len = strftime(buf, buf.len, format, tm_info); + if (len < 0) return error.CannotGetFormattedTime; - return buffer; + return buf[0..len]; } pub fn getLockState(console_dev: [:0]const u8) !struct { numlock: bool, capslock: bool, } { - const fd = std.c.open(console_dev, O_RDONLY); + const fd = std.c.open(console_dev, .{ .ACCMODE = .RDONLY }); if (fd < 0) return error.CannotOpenConsoleDev; var numlock = false; diff --git a/src/main.zig b/src/main.zig index 07b1431..fef0afe 100644 --- a/src/main.zig +++ b/src/main.zig @@ -22,7 +22,7 @@ const utils = @import("tui/utils.zig"); const Ini = ini.Ini; const termbox = interop.termbox; -var session_pid: std.os.pid_t = -1; +var session_pid: std.posix.pid_t = -1; pub fn signalHandler(i: c_int) callconv(.C) void { if (session_pid == 0) return; @@ -52,7 +52,7 @@ pub fn main() !void { ); var diag = clap.Diagnostic{}; - var res = clap.parse(clap.Help, ¶ms, clap.parsers.default, .{ .diagnostic = &diag }) catch |err| { + var res = clap.parse(clap.Help, ¶ms, clap.parsers.default, .{ .diagnostic = &diag, .allocator = allocator }) catch |err| { diag.report(stderr, err) catch {}; return err; }; @@ -67,11 +67,11 @@ pub fn main() !void { try clap.help(stderr, clap.Help, ¶ms, .{}); _ = try stderr.write("Note: if you want to configure Ly, please check the config file, which is usually located at /etc/ly/config.ini.\n"); - std.os.exit(0); + std.process.exit(0); } if (res.args.version != 0) { _ = try stderr.write("Ly version " ++ build_options.version ++ "\n"); - std.os.exit(0); + std.process.exit(0); } // Load configuration file @@ -128,44 +128,31 @@ pub fn main() !void { } // Initialize information line with host name - var got_host_name = false; - var host_name_buffer: []u8 = undefined; - get_host_name: { - const host_name_struct = interop.getHostName(allocator) catch |err| { - if (err == error.CannotGetHostName) { - try info_line.setText(lang.err_hostname); - } else { - try info_line.setText(lang.err_alloc); - } + var name_buf: [std.posix.HOST_NAME_MAX]u8 = undefined; + const hostname = std.posix.gethostname(&name_buf) catch { + try info_line.setText(lang.err_hostname); break :get_host_name; }; - - got_host_name = true; - host_name_buffer = host_name_struct.buffer; - try info_line.setText(host_name_struct.slice); - } - - defer { - if (got_host_name) allocator.free(host_name_buffer); + try info_line.setText(hostname); } // Initialize termbox _ = termbox.tb_init(); defer termbox.tb_shutdown(); - const act = std.os.Sigaction{ + const act = std.posix.Sigaction{ .handler = .{ .handler = &signalHandler }, - .mask = std.os.empty_sigset, + .mask = std.posix.empty_sigset, .flags = 0, }; - try std.os.sigaction(std.os.SIG.TERM, &act, null); + try std.posix.sigaction(std.posix.SIG.TERM, &act, null); _ = termbox.tb_select_output_mode(termbox.TB_OUTPUT_NORMAL); termbox.tb_clear(); // Needed to reset termbox after auth - const tb_termios = try std.os.tcgetattr(std.os.STDIN_FILENO); + const tb_termios = try std.posix.tcgetattr(std.posix.STDIN_FILENO); // Initialize terminal buffer const labels_max_length = @max(lang.login.len, lang.password.len); @@ -265,13 +252,7 @@ pub fn main() !void { // Switch to selected TTY if possible open_console_dev: { - const console_dev_z = allocator.dupeZ(u8, config.console_dev) catch { - try info_line.setText(lang.err_alloc); - break :open_console_dev; - }; - defer allocator.free(console_dev_z); - - const fd = std.c.open(console_dev_z, interop.O_WRONLY); + const fd = std.c.open(config.console_dev, .{ .ACCMODE = .WRONLY }); defer _ = std.c.close(fd); if (fd < 0) { @@ -347,14 +328,13 @@ pub fn main() !void { const xo = buffer.width / 2 - (format.len * (bigclock.WIDTH + 1)) / 2; const yo = (buffer.height - buffer.box_height) / 2 - bigclock.HEIGHT - 2; - const clock_str = interop.timeAsString(allocator, format, format.len + 1) catch { - try info_line.setText(lang.err_alloc); + var clock_buf: [format.len + 1:0]u8 = undefined; + const clock_str = interop.timeAsString(&clock_buf, format) catch { break :draw_big_clock; }; - defer allocator.free(clock_str); - for (0..format.len) |i| { - const clock_cell = bigclock.clockCell(animate, clock_str[i], buffer.fg, buffer.bg); + for (clock_str, 0..) |c, i| { + const clock_cell = bigclock.clockCell(animate, c, buffer.fg, buffer.bg); bigclock.alphaBlit(buffer.buffer, xo + i * (bigclock.WIDTH + 1), yo, buffer.width, buffer.height, clock_cell); } } @@ -362,23 +342,14 @@ pub fn main() !void { buffer.drawBoxCenter(!config.hide_borders, config.blank_box); if (config.clock) |clock| draw_clock: { - const clock_buffer = interop.timeAsString(allocator, clock, 32) catch { - try info_line.setText(lang.err_alloc); + var clock_buf: [32:0]u8 = undefined; + const clock_str = interop.timeAsString(&clock_buf, clock) catch { break :draw_clock; }; - defer allocator.free(clock_buffer); - var clock_str_length: u64 = 0; - for (clock_buffer, 0..) |char, i| { - if (char == 0) { - clock_str_length = i; - break; - } - } + if (clock_str.len == 0) return error.FormattedTimeEmpty; - if (clock_str_length == 0) return error.FormattedTimeEmpty; - - buffer.drawLabel(clock_buffer[0..clock_str_length], buffer.width - clock_str_length, 0); + buffer.drawLabel(clock_str, buffer.width - clock_str.len, 0); } const label_x = buffer.box_x + buffer.margin_box_h; @@ -424,12 +395,8 @@ pub fn main() !void { } draw_lock_state: { - const lock_state = interop.getLockState(config.console_dev) catch |err| { - if (err == error.CannotOpenConsoleDev) { - try info_line.setText(lang.err_console_dev); - } else { - try info_line.setText(lang.err_alloc); - } + const lock_state = interop.getLockState(config.console_dev) catch { + try info_line.setText(lang.err_console_dev); break :draw_lock_state; }; @@ -564,20 +531,20 @@ pub fn main() !void { const password_text = try allocator.dupeZ(u8, password.text.items); defer allocator.free(password_text); - session_pid = try std.os.fork(); + session_pid = try std.posix.fork(); if (session_pid == 0) { auth.authenticate(config, desktop, login_text, password_text) catch |err| { shared_err.writeError(err); - std.os.exit(1); + std.process.exit(1); }; - std.os.exit(0); + std.process.exit(0); } - _ = std.os.waitpid(session_pid, 0); + _ = std.posix.waitpid(session_pid, 0); session_pid = -1; } - var auth_err = shared_err.readError(); + const auth_err = shared_err.readError(); if (auth_err) |err| { auth_fails += 1; active_input = .password; @@ -588,7 +555,7 @@ pub fn main() !void { try info_line.setText(lang.logout); } - try std.os.tcsetattr(std.os.STDIN_FILENO, .FLUSH, tb_termios); + try std.posix.tcsetattr(std.posix.STDIN_FILENO, .FLUSH, tb_termios); termbox.tb_clear(); update = true; @@ -670,6 +637,6 @@ fn getAuthErrorMsg(err: anyerror, lang: Lang) []const u8 { error.PamSystemError => lang.err_pam_sys, error.PamUserUnknown => lang.err_pam_user_unknown, error.PamAbort => lang.err_pam_abort, - else => "An unknown error occurred", + else => lang.err_unknown, }; } diff --git a/src/tui/components/Desktop.zig b/src/tui/components/Desktop.zig index ce07cd6..8811dbd 100644 --- a/src/tui/components/Desktop.zig +++ b/src/tui/components/Desktop.zig @@ -103,7 +103,7 @@ pub fn addEnvironmentWithIni(self: *Desktop, entry_ini: Ini(Entry), display_serv } pub fn crawl(self: *Desktop, path: []const u8, display_server: DisplayServer) !void { - var iterable_directory = std.fs.openIterableDirAbsolute(path, .{}) catch return; + var iterable_directory = std.fs.openDirAbsolute(path, .{ .iterate = true }) catch return; defer iterable_directory.close(); var iterator = iterable_directory.iterate();