Mercurial > hg > octave-lojdl > gnulib-hg
diff lib/getugroups.c @ 9049:da9a878d7b51
* lib/getugroups.c (getugroups): Detect getgrent failure.
Adjust comment to reflect reality: this function may return -1.
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Fri, 06 Jul 2007 05:01:03 +0000 (2007-07-06) |
parents | 11f2466d2f5b |
children | bbbbbf4cd1c5 |
line wrap: on
line diff
--- a/lib/getugroups.c +++ b/lib/getugroups.c @@ -45,14 +45,13 @@ process. Store at most MAXCOUNT group IDs in the GROUPLIST array. If GID is not -1, store it first (if possible). GID should be the group ID (pw_gid) obtained from getpwuid, in case USERNAME is not - listed in /etc/groups. - Always return the number of groups of which USERNAME is a member. */ + listed in /etc/groups. Upon failure, set errno and return -1. + Otherwise, return the number of IDs we've written into GROUPLIST. */ int getugroups (int maxcount, GETGROUPS_T *grouplist, char const *username, gid_t gid) { - struct group *grp; int count = 0; if (gid != (gid_t) -1) @@ -63,9 +62,16 @@ } setgrent (); - while ((grp = getgrent ()) != 0) + while (1) { char **cp; + struct group *grp; + + errno = 0; + grp = getgrent (); + if (grp == NULL) + break; + for (cp = grp->gr_mem; *cp; ++cp) { int n; @@ -91,13 +97,15 @@ if (count < 0) { errno = EOVERFLOW; - count = -1; goto done; } } } } + if (errno != 0) + count = -1; + done: { int saved_errno = errno;