Back to index

glibc  2.9
Functions
getgroups.c File Reference
#include <errno.h>
#include <unistd.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sysdep.h>
#include <sys/syscall.h>
#include <bp-checks.h>
#include <linux/posix_types.h>
#include <kernel-features.h>
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

int __getgroups (int n, gid_t *groups)

Function Documentation

int __getgroups ( int  n,
gid_t groups 
)

Definition at line 43 of file getgroups.c.

{
#if __ASSUME_32BITUIDS > 0
  return INLINE_SYSCALL (getgroups32, 2, n, CHECK_N (groups, n));
#else
  if (__builtin_expect (n, 1) < 0)
    {
      __set_errno (EINVAL);
      return -1;
    }
  else
    {
# ifdef __NR_getgroups32
      if (__libc_missing_32bit_uids <= 0)
       {
         int result;
         int saved_errno = errno;

         result = INLINE_SYSCALL (getgroups32, 2, n, CHECK_N (groups, n));
         if (result != -1 || errno != ENOSYS)
           return result;

         __set_errno (saved_errno);
         __libc_missing_32bit_uids = 1;
       }
# endif /* __NR_getgroups32 */

      int i, ngids;
      __kernel_gid_t kernel_groups[n = MIN (n, __sysconf (_SC_NGROUPS_MAX))];

      ngids = INLINE_SYSCALL (getgroups, 2, n, CHECK_N (kernel_groups, n));
      if (n != 0 && ngids > 0)
       for (i = 0; i < ngids; i++)
         (__ptrvalue (groups))[i] = kernel_groups[i];
      return ngids;
    }
#endif
}

Here is the call graph for this function: