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));
  ```
This commit is contained in:
Meili C 2024-12-21 15:42:28 -09:00 committed by Alex Rønne Petersen
parent 77c63ac360
commit 0f17cbfc6a

View file

@ -1674,7 +1674,7 @@ pub fn setpgid(pid: pid_t, pgid: pid_t) usize {
return syscall2(.setpgid, @intCast(pid), @intCast(pgid)); 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")) { if (@hasField(SYS, "getgroups32")) {
return syscall2(.getgroups32, size, @intFromPtr(list)); return syscall2(.getgroups32, size, @intFromPtr(list));
} else { } else {