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>
17 libc_hidden_proto(setgroups)
19 #if defined(__NR_setgroups32)
20 # undef __NR_setgroups
21 # define __NR_setgroups __NR_setgroups32
22 _syscall2(int, setgroups, size_t, size, const gid_t *, list);
24 #elif __WORDSIZE == 64
25 _syscall2(int, setgroups, size_t, size, const gid_t *, list);
29 libc_hidden_proto(sysconf)
31 #define __NR___syscall_setgroups __NR_setgroups
32 static inline _syscall2(int, __syscall_setgroups,
33 size_t, size, const __kernel_gid_t *, list);
35 int setgroups(size_t size, const gid_t *groups)
37 if (size > (size_t) sysconf(_SC_NGROUPS_MAX)) {
43 __kernel_gid_t *kernel_groups = NULL;
46 kernel_groups = (__kernel_gid_t *)malloc(sizeof(*kernel_groups) * size);
47 if (kernel_groups == NULL)
51 for (i = 0; i < size; i++) {
52 kernel_groups[i] = (groups)[i];
53 if (groups[i] != (gid_t) ((__kernel_gid_t) groups[i])) {
58 i = __syscall_setgroups(size, kernel_groups);
65 libc_hidden_def(setgroups)