Back to index

glibc  2.9
Functions
setgroups.c File Reference
#include <errno.h>
#include <grp.h>
#include <unistd.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 setgroups (size_t n, const gid_t *groups)

Function Documentation

int setgroups ( size_t  n,
const gid_t groups 
)

Definition at line 44 of file setgroups.c.

{
#if __ASSUME_32BITUIDS > 0
  return INLINE_SYSCALL (setgroups32, 2, n, CHECK_N (groups, n));
#else
  if (n > (size_t) __sysconf (_SC_NGROUPS_MAX))
    {
      __set_errno (EINVAL);
      return -1;
    }
  else
    {
      size_t i;
      __kernel_gid_t kernel_groups[n];

# ifdef __NR_setgroups32
      if (__libc_missing_32bit_uids <= 0)
       {
         int result;
         int saved_errno = errno;

         result = INLINE_SYSCALL (setgroups32, 2, n, CHECK_N (groups, n));
         if (result == 0 || errno != ENOSYS)
           return result;

         __set_errno (saved_errno);
         __libc_missing_32bit_uids = 1;
       }
# endif /* __NR_setgroups32 */
      for (i = 0; i < n; i++)
       {
         kernel_groups[i] = (__ptrvalue (groups))[i];
         if (groups[i] != (gid_t) ((__kernel_gid_t) groups[i]))
           {
             __set_errno (EINVAL);
             return -1;
           }
       }

      return INLINE_SYSCALL (setgroups, 2, n, CHECK_N (kernel_groups, n));
    }
#endif
}

Here is the call graph for this function: