authorgravatar for sweetbabyalaska@gmail.comMeili C <sweetbabyalaska@gmail.com> 2024-12-21 15:42:28-09:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-12-22 21:48:47+01:00
log0f17cbfc6a19e639d6cb3f764e32b77e8c2869e7
treef9a33a952141560d0972b955a25995e56330e180
parent77c63ac36034db577a9287c54fb6771429a7428f

fix: allow std.linux.getgroups to accept null

looking at `man getgroups` and `info getgroups` this is given as an example: ```c // Here's how to use ‘getgroups’ to read all the supplementary group // IDs: gid_t * read_all_groups (void) { int ngroups = getgroups (0, NULL); gid_t *groups = (gid_t *) xmalloc (ngroups * sizeof (gid_t)); int val = getgroups (ngroups, groups); if (val < 0) { free (groups); return NULL; } return groups; } ``` getgroups(0, NULL) is used to get the count of groups so that the correct count can be used to allocate a list of gid_t. This small changes makes this possible. equivalent example in Zig after the change: ```zig // get the group count const ngroups: usize = std.os.linux.getgroups(0, null); if (ngroups <= 0) { return error.GetGroupsError; } std.debug.print("number of groups: {d}\n", .{ngroups}); const groups_gids: []u32 = try alloc.alloc(u32, ngroups); // populate an array of gid_t _ = std.os.linux.getgroups(ngroups, @ptrCast(groups_gids)); ```

1 files changed, 1 insertions(+), 1 deletions(-)

lib/std/os/linux.zig+1-1
...@@ -1674,7 +1674,7 @@ pub fn setpgid(pid: pid_t, pgid: pid_t) usize {...@@ -1674,7 +1674,7 @@ pub fn setpgid(pid: pid_t, pgid: pid_t) usize {
1674 return syscall2(.setpgid, @intCast(pid), @intCast(pgid));1674 return syscall2(.setpgid, @intCast(pid), @intCast(pgid));
1675}1675}
16761676
1677pub fn getgroups(size: usize, list: *gid_t) usize {1677pub fn getgroups(size: usize, list: ?*gid_t) usize {
1678 if (@hasField(SYS, "getgroups32")) {1678 if (@hasField(SYS, "getgroups32")) {
1679 return syscall2(.getgroups32, size, @intFromPtr(list));1679 return syscall2(.getgroups32, size, @intFromPtr(list));
1680 } else {1680 } else {