Exemple #1
0
struct group *getgrent(void)
{
  if (group_fp == NULL)
    return NULL;
  if (!scangr(group_fp, &grent, grbuf, sizeof grbuf))
    return NULL;
  return &grent;
}
Exemple #2
0
int 
initgroups (const char *name, gid_t basegid)
{
  char bufgroup[512];
  struct group grpbuf;
  FILE *grp;
  
  gid_t gitlist[NGROUPS_MAX];
  int   index = 1;
  
  if (!name) {
    errno = EINVAL;
    return -1;
  }
  
  init_etc_passwd_group();
  
  grp = fopen("/etc/group", "r");
  if (grp == NULL) {
    return 0;
  }
  
  gitlist[0] = basegid;
  
  for (;;) {
    int j;
    
    if (!scangr(grp, &grpbuf, bufgroup, sizeof bufgroup)) {
      break;
    }
    
    if (grpbuf.gr_gid != basegid) {
      for (j = 0; grpbuf.gr_mem[j]; j++) {
        if (strcmp(grpbuf.gr_mem[j], name) == 0) {
            
          gitlist[index++] = grpbuf.gr_gid;
          if (index >= NGROUPS_MAX) {
            break;
          }
        }
      }
    }
  }
  
  fclose(grp);
  if (index > 0) {
    return setgroups(index, gitlist);
  
  } else {
    return 0;
  }
}
Exemple #3
0
static int getgr_r(
  const char     *name,
  int             gid,
  struct group   *grp,
  char           *buffer,
  size_t          bufsize,
  struct group  **result
)
{
  FILE *fp;
  int match;

  init_etc_passwd_group();

  if ((fp = fopen("/etc/group", "r")) == NULL) {
    errno = EINVAL;
    return -1;
  }
  for(;;) {
    if (!scangr(fp, grp, buffer, bufsize)) {
      errno = EINVAL;
      fclose(fp);
      return -1;
    }
    if (name) {
      match = (strcmp(grp->gr_name, name) == 0);
    }
    else {
      match = (grp->gr_gid == gid);
    }
    if (match) {
      fclose(fp);
      *result = grp;
      return 0;
    }
  }
  fclose(fp);
  errno = EINVAL;
  return -1;
}
Exemple #4
0
static int getgr_r(
  const char     *name,
  int             gid,
  struct group   *grp,
  char           *buffer,
  size_t          bufsize,
  struct group  **result
)
{
  FILE *fp;
  int match;

  init_etc_passwd_group();

  if ((fp = fopen("/etc/group", "r")) == NULL)
    rtems_set_errno_and_return_minus_one( EINVAL );

  for(;;) {
    if (!scangr(fp, grp, buffer, bufsize))
      goto error_einval;

    if (name) {
      match = (strcmp(grp->gr_name, name) == 0);
    } else {
      match = (grp->gr_gid == gid);
    }

    if (match) {
      fclose(fp);
      *result = grp;
      return 0;
    }
  }
error_einval:
  fclose(fp);
  rtems_set_errno_and_return_minus_one( EINVAL );
}