libnss: shorter code

This commit is contained in:
Motiejus Jakštys 2022-07-06 13:53:34 +03:00
parent 9bd922a55a
commit 59eae5fa3b
2 changed files with 31 additions and 27 deletions

View File

@ -350,7 +350,7 @@ fn pushStr(str: []const u8, buf: []u8, offset: *usize) [*]const u8 {
return @ptrCast([*]const u8, &buf[start]); return @ptrCast([*]const u8, &buf[start]);
} }
fn getUser(self: *const DB, user: PackedUser, buf: []u8) error{OutOfMemory}!CUser { fn getUser(self: *const DB, user: PackedUser, buf: []u8) error{BufferTooSmall}!CUser {
const shell_reader = ShellReader{ const shell_reader = ShellReader{
.index = self.shell_index, .index = self.shell_index,
.blob = self.shell_blob, .blob = self.shell_blob,
@ -365,7 +365,7 @@ fn getUser(self: *const DB, user: PackedUser, buf: []u8) error{OutOfMemory}!CUse
gecos.len + 1 + gecos.len + 1 +
home.len + 1 + home.len + 1 +
shell.len + 1; shell.len + 1;
if (strlen > buf.len) return error.OutOfMemory; if (strlen > buf.len) return error.BufferTooSmall;
var offset: usize = 0; var offset: usize = 0;
const pw_name = pushStr(name, buf, &offset); const pw_name = pushStr(name, buf, &offset);
@ -384,7 +384,7 @@ fn getUser(self: *const DB, user: PackedUser, buf: []u8) error{OutOfMemory}!CUse
} }
// get a CUser entry by name. // get a CUser entry by name.
pub fn getpwnam(self: *const DB, name: []const u8, buf: []u8) error{OutOfMemory}!?CUser { pub fn getpwnam(self: *const DB, name: []const u8, buf: []u8) error{BufferTooSmall}!?CUser {
const idx = bdz.search(self.bdz_username, name); const idx = bdz.search(self.bdz_username, name);
// bdz may return a hash that's bigger than the number of users // bdz may return a hash that's bigger than the number of users
if (idx >= self.header.num_users) return null; if (idx >= self.header.num_users) return null;
@ -396,7 +396,7 @@ pub fn getpwnam(self: *const DB, name: []const u8, buf: []u8) error{OutOfMemory}
} }
// get a CUser entry by uid. // get a CUser entry by uid.
pub fn getpwuid(self: *const DB, uid: u32, buf: []u8) error{OutOfMemory}!?CUser { pub fn getpwuid(self: *const DB, uid: u32, buf: []u8) error{BufferTooSmall}!?CUser {
const idx = bdz.search_u32(self.bdz_uid, uid); const idx = bdz.search_u32(self.bdz_uid, uid);
if (idx >= self.header.num_users) return null; if (idx >= self.header.num_users) return null;
const offset = self.idx_uid2user[idx]; const offset = self.idx_uid2user[idx];
@ -759,7 +759,7 @@ test "getpwnam/getpwuid" {
const long = try db.getpwnam("Name" ** 8, buf); const long = try db.getpwnam("Name" ** 8, buf);
try testing.expectEqualStrings(long.?.pw_name[0..33], "Name" ** 8 ++ "\x00"); try testing.expectEqualStrings(long.?.pw_name[0..33], "Name" ** 8 ++ "\x00");
buf.len -= 1; buf.len -= 1;
try testing.expectError(error.OutOfMemory, db.getpwnam("Name" ** 8, buf)); try testing.expectError(error.BufferTooSmall, db.getpwnam("Name" ** 8, buf));
} }
test "additionalGids" { test "additionalGids" {

View File

@ -19,10 +19,10 @@ const c = @cImport({
}); });
const ENV_DB = "TURBONSS_DB"; const ENV_DB = "TURBONSS_DB";
const ENV_VERBOSE = "TURBONSS__VERBOSE"; const ENV_VERBOSE = "TURBONSS_VERBOSE";
const ENV_OMIT_MEMBERS = "TURBONSS_OMIT_MEMBERS"; const ENV_OMIT_MEMBERS = "TURBONSS_OMIT_MEMBERS";
export const turbonss_default_path: [:0]const u8 = "/etc/turbonss/db.turbo"; export var turbonss_db_path: [:0]const u8 = "/etc/turbonss/db.turbo";
pub var log_level: std.log.Level = .err; pub var log_level: std.log.Level = .err;
@ -47,7 +47,7 @@ fn init() void {
else else
.err; .err;
const fname = os.getenvZ(ENV_DB) orelse turbonss_default_path[0..]; const fname = os.getenvZ(ENV_DB) orelse turbonss_db_path[0..];
log.debug("opening {s}", .{fname}); log.debug("opening {s}", .{fname});
const env_omit_members = os.getenvZ(ENV_OMIT_MEMBERS) orelse "auto"; const env_omit_members = os.getenvZ(ENV_OMIT_MEMBERS) orelse "auto";
@ -75,34 +75,38 @@ fn shouldOmitMembers(envvar: []const u8, argv: [][*:0]u8) bool {
export fn _nss_turbo_getpwuid_r( export fn _nss_turbo_getpwuid_r(
uid: c_uint, uid: c_uint,
res: *CUser, pwd: *CUser,
buf: [*]u8, buf: [*]u8,
len: usize, buflen: usize,
errnop: *c_int, errnop: *c_int,
) c.enum_nss_status { ) c.enum_nss_status {
global_init.call(); const db = get_db(errnop) orelse return c.NSS_STATUS_UNAVAIL;
if (global_state.file == null) { if (db.getpwuid(uid, buf[0..buflen])) |maybe_cuser| {
errnop.* = @enumToInt(os.E.AGAIN); if (maybe_cuser) |cuser| {
return c.NSS_STATUS_UNAVAIL; pwd.* = cuser;
} return c.NSS_STATUS_SUCCESS;
} else {
const db = global_state.file.?.db;
const cuser = db.getpwuid(uid, buf[0..len]) catch |err| switch (err) {
error.OutOfMemory => {
errnop.* = @enumToInt(os.E.RANGE);
return c.NSS_STATUS_TRYAGAIN;
},
};
if (cuser == null) {
errnop.* = @enumToInt(os.E.NOENT); errnop.* = @enumToInt(os.E.NOENT);
return c.NSS_STATUS_NOTFOUND; return c.NSS_STATUS_NOTFOUND;
} }
res.* = cuser.?; } else |err| switch (err) {
error.BufferTooSmall => {
errnop.* = @enumToInt(os.E.RANGE);
return c.NSS_STATUS_TRYAGAIN;
},
}
}
return c.NSS_STATUS_SUCCESS; fn get_db(errnop: *c_int) ?DB {
global_init.call();
if (global_state.file) |file| {
return file.db;
} else {
errnop.* = @enumToInt(os.E.AGAIN);
return null;
}
} }
const testing = std.testing; const testing = std.testing;