OSDN Git Service

hidden_def/hidden_proto: convert all users (I hope) termios split, add some missing...
[uclinux-h8/uClibc.git] / libc / sysdeps / linux / common / setgroups.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * setgroups() for uClibc
4  *
5  * Copyright (C) 2000-2004 by Erik Andersen <andersen@codepoet.org>
6  *
7  * GNU Library General Public License (LGPL) version 2 or later.
8  */
9
10 #include "syscalls.h"
11 #include <stdlib.h>
12 #include <unistd.h>
13 #include <grp.h>
14
15 libc_hidden_proto(sysconf)
16
17 #define __NR___syscall_setgroups __NR_setgroups
18 static inline _syscall2(int, __syscall_setgroups,
19                 size_t, size, const __kernel_gid_t *, list);
20
21 int setgroups(size_t size, const gid_t *groups)
22 {
23         if (size > (size_t) sysconf(_SC_NGROUPS_MAX)) {
24 ret_error:
25                 __set_errno(EINVAL);
26                 return -1;
27         } else {
28                 size_t i;
29                 __kernel_gid_t *kernel_groups = NULL;
30
31                 if (size) {
32                         kernel_groups = (__kernel_gid_t *)malloc(sizeof(*kernel_groups) * size);
33                         if (kernel_groups == NULL)
34                                 goto ret_error;
35                 }
36
37                 for (i = 0; i < size; i++) {
38                         kernel_groups[i] = (groups)[i];
39                         if (groups[i] != (gid_t) ((__kernel_gid_t) groups[i])) {
40                                 goto ret_error;
41                         }
42                 }
43
44                 i = __syscall_setgroups(size, kernel_groups);
45                 if (kernel_groups)
46                         free(kernel_groups);
47                 return i;
48         }
49 }
50 libc_hidden_proto(setgroups)
51 libc_hidden_def(setgroups)