From 7b9f03176dbc3d1013d4d5da3650483d9d2ec693 Mon Sep 17 00:00:00 2001 From: AnErrupTion Date: Sun, 4 Aug 2024 11:04:23 +0200 Subject: [PATCH] FreeBSD fixes Signed-off-by: AnErrupTion --- src/auth.zig | 12 ++++++------ src/interop.zig | 8 +++++++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/auth.zig b/src/auth.zig index c0dc550..7b8f136 100644 --- a/src/auth.zig +++ b/src/auth.zig @@ -66,12 +66,12 @@ pub fn authenticate(config: Config, current_environment: Session.Environment, lo if (status != interop.pam.PAM_SUCCESS) return pamDiagnose(status); defer status = interop.pam.pam_close_session(handle, 0); - var pwd: *interop.pwd.passwd = undefined; + var pwd: *interop.passwd = undefined; { - defer interop.pwd.endpwent(); + defer interop.endpwent(); // Get password structure from username - pwd = interop.pwd.getpwnam(login) orelse return error.GetPasswordNameFailed; + pwd = interop.getpwnam(login) orelse return error.GetPasswordNameFailed; } // Set user shell if it hasn't already been set @@ -126,7 +126,7 @@ pub fn authenticate(config: Config, current_environment: Session.Environment, lo fn startSession( config: Config, - pwd: *interop.pwd.passwd, + pwd: *interop.passwd, handle: ?*interop.pam.pam_handle, current_environment: Session.Environment, ) !void { @@ -136,7 +136,7 @@ fn startSession( if (status != 0) return error.GroupInitializationFailed; // FreeBSD sets the GID and UID with setusercontext() - const result = std.c.setusercontext(null, pwd, pwd.pw_uid, interop.logincap.LOGIN_SETALL); + const result = interop.logincap.setusercontext(null, pwd, pwd.pw_uid, interop.logincap.LOGIN_SETALL); if (result != 0) return error.SetUserUidFailed; } else { const status = interop.grp.initgroups(pwd.pw_name, pwd.pw_gid); @@ -173,7 +173,7 @@ fn startSession( } } -fn initEnv(pwd: *interop.pwd.passwd, path_env: ?[:0]const u8) !void { +fn initEnv(pwd: *interop.passwd, path_env: ?[:0]const u8) !void { _ = interop.stdlib.setenv("HOME", pwd.pw_dir, 1); _ = interop.stdlib.setenv("PWD", pwd.pw_dir, 1); _ = interop.stdlib.setenv("SHELL", pwd.pw_shell, 1); diff --git a/src/interop.zig b/src/interop.zig index e2f4ea4..aba5d8c 100644 --- a/src/interop.zig +++ b/src/interop.zig @@ -41,8 +41,9 @@ pub const grp = @cImport({ @cInclude("grp.h"); }); -// FreeBSD-specific headers +// FreeBSD-specific headers (except for pwd.h) pub const logincap = @cImport({ + @cInclude("pwd.h"); @cInclude("login_cap.h"); }); @@ -60,6 +61,11 @@ pub const vt = @cImport({ @cInclude("sys/vt.h"); }); +// On FreeBSD, login_cap.h references the passwd struct directly, so we must use logincap.passwd instead +pub const passwd = if (builtin.os.tag == .freebsd) logincap.passwd else pwd.passwd; +pub const endpwent = if (builtin.os.tag == .freebsd) logincap.endpwent else pwd.endpwent; +pub const getpwnam = if (builtin.os.tag == .freebsd) logincap.getpwnam else pwd.getpwnam; + // Used for getting & setting the lock state const LedState = if (builtin.os.tag.isBSD()) c_int else c_char; const get_led_state = if (builtin.os.tag.isBSD()) kbio.KDGETLED else kd.KDGKBLED;