FreeBSD fixes

Signed-off-by: AnErrupTion <anerruption@disroot.org>
This commit is contained in:
AnErrupTion
2024-08-04 11:04:23 +02:00
parent b73c78d2fb
commit 7b9f03176d
2 changed files with 13 additions and 7 deletions

View File

@@ -66,12 +66,12 @@ pub fn authenticate(config: Config, current_environment: Session.Environment, lo
if (status != interop.pam.PAM_SUCCESS) return pamDiagnose(status); if (status != interop.pam.PAM_SUCCESS) return pamDiagnose(status);
defer status = interop.pam.pam_close_session(handle, 0); 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 // 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 // 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( fn startSession(
config: Config, config: Config,
pwd: *interop.pwd.passwd, pwd: *interop.passwd,
handle: ?*interop.pam.pam_handle, handle: ?*interop.pam.pam_handle,
current_environment: Session.Environment, current_environment: Session.Environment,
) !void { ) !void {
@@ -136,7 +136,7 @@ fn startSession(
if (status != 0) return error.GroupInitializationFailed; if (status != 0) return error.GroupInitializationFailed;
// FreeBSD sets the GID and UID with setusercontext() // 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; if (result != 0) return error.SetUserUidFailed;
} else { } else {
const status = interop.grp.initgroups(pwd.pw_name, pwd.pw_gid); 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("HOME", pwd.pw_dir, 1);
_ = interop.stdlib.setenv("PWD", pwd.pw_dir, 1); _ = interop.stdlib.setenv("PWD", pwd.pw_dir, 1);
_ = interop.stdlib.setenv("SHELL", pwd.pw_shell, 1); _ = interop.stdlib.setenv("SHELL", pwd.pw_shell, 1);

View File

@@ -41,8 +41,9 @@ pub const grp = @cImport({
@cInclude("grp.h"); @cInclude("grp.h");
}); });
// FreeBSD-specific headers // FreeBSD-specific headers (except for pwd.h)
pub const logincap = @cImport({ pub const logincap = @cImport({
@cInclude("pwd.h");
@cInclude("login_cap.h"); @cInclude("login_cap.h");
}); });
@@ -60,6 +61,11 @@ pub const vt = @cImport({
@cInclude("sys/vt.h"); @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 // Used for getting & setting the lock state
const LedState = if (builtin.os.tag.isBSD()) c_int else c_char; 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; const get_led_state = if (builtin.os.tag.isBSD()) kbio.KDGETLED else kd.KDGKBLED;