1 /* vi: set sw=4 ts=4: */
3 * setgroups() for uClibc
5 * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
7 * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
10 #include <sys/syscall.h>
15 #if defined(__NR_setgroups32)
16 # undef __NR_setgroups
17 # define __NR_setgroups __NR_setgroups32
18 _syscall2(int, setgroups, size_t, size, const gid_t *, list)
20 #elif __WORDSIZE == 64
21 _syscall2(int, setgroups, size_t, size, const gid_t *, list)
27 # include <sys/types.h>
29 # define __NR___syscall_setgroups __NR_setgroups
30 static __always_inline _syscall2(int, __syscall_setgroups,
31 size_t, size, const __kernel_gid_t *, list)
33 int setgroups(size_t size, const gid_t *groups)
35 if (size > (size_t) sysconf(_SC_NGROUPS_MAX)) {
41 __kernel_gid_t *kernel_groups = NULL;
44 kernel_groups = (__kernel_gid_t *)malloc(sizeof(*kernel_groups) * size);
45 if (kernel_groups == NULL)
49 for (i = 0; i < size; i++) {
50 kernel_groups[i] = (groups)[i];
51 if (groups[i] != (gid_t) ((__kernel_gid_t) groups[i])) {
56 i = __syscall_setgroups(size, kernel_groups);
63 libc_hidden_def(setgroups)