Commit 0f17cbfc6a

Meili C <sweetbabyalaska@gmail.com>
2024-12-22 01:42:28
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 parent 77c63ac
Changed files (1)
lib
std
lib/std/os/linux.zig
@@ -1674,7 +1674,7 @@ pub fn setpgid(pid: pid_t, pgid: pid_t) usize {
     return syscall2(.setpgid, @intCast(pid), @intCast(pgid));
 }
 
-pub fn getgroups(size: usize, list: *gid_t) usize {
+pub fn getgroups(size: usize, list: ?*gid_t) usize {
     if (@hasField(SYS, "getgroups32")) {
         return syscall2(.getgroups32, size, @intFromPtr(list));
     } else {