| author | |
| committer | |
| log | 0f17cbfc6a19e639d6cb3f764e32b77e8c2869e7 |
| tree | f9a33a952141560d0972b955a25995e56330e180 |
| parent | 77c63ac36034db577a9287c54fb6771429a7428f |
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 | } |
| 1676 | 1676 | ||
| 1677 | pub fn getgroups(size: usize, list: *gid_t) usize { | 1677 | pub 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 { |