summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/common/getgroups.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/common/getgroups.c')
-rw-r--r--libc/sysdeps/linux/common/getgroups.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/common/getgroups.c b/libc/sysdeps/linux/common/getgroups.c
new file mode 100644
index 000000000..21085ea78
--- /dev/null
+++ b/libc/sysdeps/linux/common/getgroups.c
@@ -0,0 +1,36 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * getgroups() for uClibc
+ *
+ * Copyright (C) 2000-2004 by Erik Andersen <andersen@codpoet.org>
+ *
+ * GNU Library General Public License (LGPL) version 2 or later.
+ */
+
+#include "syscalls.h"
+#include <unistd.h>
+
+#define MIN(a,b) (((a)<(b))?(a):(b))
+
+#define __NR___syscall_getgroups __NR_getgroups
+static inline _syscall2(int, __syscall_getgroups,
+ int, size, __kernel_gid_t *, list);
+
+int getgroups(int n, gid_t * groups)
+{
+ if (unlikely(n < 0)) {
+ __set_errno(EINVAL);
+ return -1;
+ } else {
+ int i, ngids;
+ __kernel_gid_t kernel_groups[n = MIN(n, sysconf(_SC_NGROUPS_MAX))];
+
+ ngids = __syscall_getgroups(n, kernel_groups);
+ if (n != 0 && ngids > 0) {
+ for (i = 0; i < ngids; i++) {
+ groups[i] = kernel_groups[i];
+ }
+ }
+ return ngids;
+ }
+}