&errno);
limit, &errno);
initgroups (user, group)     const char *user;     gid_t group;{#if defined NGROUPS_MAX && NGROUPS_MAX == 0  /* No extra groups allowed.  */  return 0;#else  service_user *nip = NULL;  initgroups_function fct;  enum nss_status status = NSS_STATUS_UNAVAIL;  int no_more;  /* Start is one, because we have the first group as parameter.  */  long int start = 1;  long int size;  gid_t *groups;  int result;#ifdef NGROUPS_MAX  size = NGROUPS_MAX;#else  long int limit = __sysconf (_SC_NGROUPS_MAX);  if (limit > 0)    size = limit;  else    /* No fixed limit on groups.  Pick a starting buffer size.  */    size = 16;#endif  groups = (gid_t *) malloc (size * sizeof (gid_t));  if (__builtin_expect (groups == NULL, 0))    /* No more memory.  */    return -1;  groups[0] = group;  if (__nss_group_database != NULL)    {      no_more = 0;      nip = __nss_group_database;    }  else    no_more = __nss_database_lookup ("group", NULL,				     "compat [NOTFOUND=return] files", &nip);  while (! no_more)    {      fct = __nss_lookup_function (nip, "initgroups_dyn");      if (fct == NULL)	{	  status = compat_call (nip, user, group, &start, &size, &groups,				&errno);	  if (nss_next_action (nip, NSS_STATUS_UNAVAIL) != NSS_ACTION_CONTINUE)	    break;	}      else	status = DL_CALL_FCT (fct, (user, group, &start, &size, &groups,				    &errno));      /* This is really only for debugging.  */      if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN)	__libc_fatal ("illegal status in " __FUNCTION__);      if (status != NSS_STATUS_SUCCESS	  && nss_next_action (nip, status) == NSS_ACTION_RETURN)	 break;      if (nip->next == NULL)	no_more = -1;      else	nip = nip->next;    }  /* Try to set the maximum number of groups the kernel can handle.  */  do    result = setgroups (start, groups);  while (result == -1 && errno == EINVAL && --start > 0);  return result;#endif}