wip initgroups_dyn
This commit is contained in:
125
src/libnss.zig
125
src/libnss.zig
@@ -117,13 +117,13 @@ export fn _nss_turbo_getpwuid_r(
|
||||
},
|
||||
};
|
||||
|
||||
if (cuser) |got| {
|
||||
passwd.* = got;
|
||||
return c.NSS_STATUS_SUCCESS;
|
||||
} else {
|
||||
const got_cuser = cuser orelse {
|
||||
errnop.* = @enumToInt(os.E.NOENT);
|
||||
return c.NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
};
|
||||
|
||||
passwd.* = got_cuser;
|
||||
return c.NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
export fn _nss_turbo_getpwnam_r(
|
||||
@@ -144,13 +144,13 @@ export fn _nss_turbo_getpwnam_r(
|
||||
},
|
||||
};
|
||||
|
||||
if (cuser) |got| {
|
||||
passwd.* = got;
|
||||
return c.NSS_STATUS_SUCCESS;
|
||||
} else {
|
||||
const got_cuser = cuser orelse {
|
||||
errnop.* = @enumToInt(os.E.NOENT);
|
||||
return c.NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
};
|
||||
|
||||
passwd.* = got_cuser;
|
||||
return c.NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
export fn _nss_turbo_getgrgid_r(
|
||||
@@ -168,13 +168,13 @@ export fn _nss_turbo_getgrgid_r(
|
||||
},
|
||||
};
|
||||
|
||||
if (cgroup) |got| {
|
||||
gr.* = got;
|
||||
return c.NSS_STATUS_SUCCESS;
|
||||
} else {
|
||||
const got_cgroup = cgroup orelse {
|
||||
errnop.* = @enumToInt(os.E.NOENT);
|
||||
return c.NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
};
|
||||
|
||||
gr.* = got_cgroup;
|
||||
return c.NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
export fn _nss_turbo_getgrnam_r(
|
||||
@@ -194,13 +194,13 @@ export fn _nss_turbo_getgrnam_r(
|
||||
},
|
||||
};
|
||||
|
||||
if (cgroup) |got| {
|
||||
group.* = got;
|
||||
return c.NSS_STATUS_SUCCESS;
|
||||
} else {
|
||||
const got_cgroup = cgroup orelse {
|
||||
errnop.* = @enumToInt(os.E.NOENT);
|
||||
return c.NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
};
|
||||
|
||||
group.* = got_cgroup;
|
||||
return c.NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
export fn _nss_turbo_setpwent(_: c_int) void {
|
||||
@@ -221,11 +221,11 @@ export fn _nss_turbo_setpwent(_: c_int) void {
|
||||
|
||||
export fn _nss_turbo_endpwent() void {
|
||||
global_init.call();
|
||||
if (global_state) |*state| {
|
||||
state.getpwent_iterator_mu.lock();
|
||||
defer state.getpwent_iterator_mu.unlock();
|
||||
state.getpwent_iterator = null;
|
||||
}
|
||||
var state = global_state orelse return;
|
||||
|
||||
state.getpwent_iterator_mu.lock();
|
||||
state.getpwent_iterator = null;
|
||||
state.getpwent_iterator_mu.unlock();
|
||||
}
|
||||
|
||||
export fn _nss_turbo_setgrent(_: c_int) void {
|
||||
@@ -239,9 +239,10 @@ export fn _nss_turbo_setgrent(_: c_int) void {
|
||||
|
||||
export fn _nss_turbo_endgrent() void {
|
||||
var state = getState() orelse return;
|
||||
|
||||
state.getgrent_iterator_mu.lock();
|
||||
defer state.getgrent_iterator_mu.unlock();
|
||||
state.getgrent_iterator = null;
|
||||
state.getgrent_iterator_mu.unlock();
|
||||
}
|
||||
|
||||
export fn _nss_turbo_getgrent_r(
|
||||
@@ -261,20 +262,80 @@ export fn _nss_turbo_getgrent_r(
|
||||
return c.NSS_STATUS_UNAVAIL;
|
||||
};
|
||||
|
||||
var group = it.next() orelse {
|
||||
const group = it.next() orelse {
|
||||
errnop.* = @enumToInt(os.E.NOENT);
|
||||
return c.NSS_STATUS_NOTFOUND;
|
||||
};
|
||||
|
||||
if (state.file.db.getGroup(group, buffer[0..buflen])) |cgroup| {
|
||||
result.* = cgroup;
|
||||
return c.NSS_STATUS_SUCCESS;
|
||||
} else |err| switch (err) {
|
||||
const buf = buffer[0..buflen];
|
||||
const cgroup = state.file.db.packCGroup(group, buf) catch |err| switch (err) {
|
||||
error.BufferTooSmall => {
|
||||
errnop.* = @enumToInt(os.E.RANGE);
|
||||
return c.NSS_STATUS_TRYAGAIN;
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
result.* = cgroup;
|
||||
return c.NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
export fn _nss_turbo_getpwent_r(
|
||||
result: *CUser,
|
||||
buffer: [*]u8,
|
||||
buflen: usize,
|
||||
errnop: *c_int,
|
||||
) c.enum_nss_status {
|
||||
var state = getStateErrno(errnop) orelse return c.NSS_STATUS_UNAVAIL;
|
||||
|
||||
state.getpwent_iterator_mu.lock();
|
||||
defer state.getpwent_iterator_mu.unlock();
|
||||
|
||||
var it = state.getpwent_iterator orelse {
|
||||
// logic from _nss_systemd_getgrent_r
|
||||
errnop.* = @enumToInt(os.E.HOSTDOWN);
|
||||
return c.NSS_STATUS_UNAVAIL;
|
||||
};
|
||||
|
||||
const user = it.next() orelse {
|
||||
errnop.* = @enumToInt(os.E.NOENT);
|
||||
return c.NSS_STATUS_NOTFOUND;
|
||||
};
|
||||
|
||||
const buf = buffer[0..buflen];
|
||||
const cuser = state.file.db.writeUser(user, buf) catch |err| switch (err) {
|
||||
error.BufferTooSmall => {
|
||||
errnop.* = @enumToInt(os.E.RANGE);
|
||||
return c.NSS_STATUS_TRYAGAIN;
|
||||
},
|
||||
};
|
||||
|
||||
result.* = cuser;
|
||||
return c.NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
export fn _nss_turbo_initgroups_dyn(
|
||||
user_name: [*:0]const u8,
|
||||
_: u32,
|
||||
start: *c_long,
|
||||
size: *c_long,
|
||||
groups: [*]u32,
|
||||
limit: c_long,
|
||||
errnop: *c_int,
|
||||
) c.enum_nss_status {
|
||||
const db = getDBErrno(errnop) orelse return c.NSS_STATUS_UNAVAIL;
|
||||
|
||||
const user = db.getUser(mem.sliceTo(user_name, 0)) orelse {
|
||||
errnop.* = @enumToInt(os.E.NOENT);
|
||||
return c.NSS_STATUS_NOTFOUND;
|
||||
};
|
||||
|
||||
_ = user;
|
||||
_ = start;
|
||||
_ = size;
|
||||
_ = groups;
|
||||
_ = limit;
|
||||
|
||||
return c.NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
fn getState() ?State {
|
||||
|
||||
Reference in New Issue
Block a user