struct group *getgrent(void) { if (group_fp == NULL) return NULL; if (!scangr(group_fp, &grent, grbuf, sizeof grbuf)) return NULL; return &grent; }
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; } }
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; }
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 ); }