diff options
Diffstat (limited to 'grp')
-rw-r--r-- | grp/fgetgrent.c | 8 | ||||
-rw-r--r-- | grp/fgetgrent_r.c | 15 | ||||
-rw-r--r-- | grp/grp.h | 36 | ||||
-rw-r--r-- | grp/testgrp.c | 2 |
4 files changed, 35 insertions, 26 deletions
diff --git a/grp/fgetgrent.c b/grp/fgetgrent.c index 95ae2ecd6a..66dd305b0b 100644 --- a/grp/fgetgrent.c +++ b/grp/fgetgrent.c @@ -25,7 +25,11 @@ struct group * fgetgrent (FILE *stream) { static char buffer[BUFSIZ]; - static struct group result; + static struct group resbuf; + struct group *result; - return __fgetgrent_r (stream, &result, buffer, sizeof buffer); + if (__fgetgrent_r (stream, &resbuf, buffer, sizeof buffer, &result) != 0) + return NULL; + + return result; } diff --git a/grp/fgetgrent_r.c b/grp/fgetgrent_r.c index d8a8bfb2e1..e9a2c25a5a 100644 --- a/grp/fgetgrent_r.c +++ b/grp/fgetgrent_r.c @@ -42,8 +42,9 @@ LINE_PARSER /* Read one entry from the given stream. */ -struct group * -__fgetgrent_r (FILE *stream, struct group *result, char *buffer, int buflen) +int +__fgetgrent_r (FILE *stream, struct group *resbuf, char *buffer, size_t buflen, + struct group **result) { char *p; @@ -51,7 +52,10 @@ __fgetgrent_r (FILE *stream, struct group *result, char *buffer, int buflen) { p = fgets (buffer, buflen, stream); if (p == NULL) - return NULL; + { + *result = NULL; + return errno; + } /* Skip leading blanks. */ while (isspace (*p)) @@ -59,8 +63,9 @@ __fgetgrent_r (FILE *stream, struct group *result, char *buffer, int buflen) } while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */ /* Parse the line. If it is invalid, loop to get the next line of the file to parse. */ - ! parse_line (p, result, (void *) buffer, buflen)); + ! parse_line (p, resbuf, (void *) buffer, buflen)); - return result; + *result = resbuf; + return 0; } weak_alias (__fgetgrent_r, fgetgrent_r) diff --git a/grp/grp.h b/grp/grp.h index 6a88191380..c03772cb34 100644 --- a/grp/grp.h +++ b/grp/grp.h @@ -51,7 +51,7 @@ extern FILE *__grpopen __P ((void)); /* Read a group entry from STREAM, filling in G. Return the `struct group' of G if successful, NULL on failure. */ -extern struct group *__grpread __P ((FILE * __stream, __ptr_t __g)); +extern struct group *__grpread __P ((FILE *__stream, __ptr_t __g)); /* Return a chunk of memory containing pre-initialized data for __grpread. */ extern __ptr_t __grpalloc __P ((void)); @@ -76,7 +76,7 @@ extern struct group *getgrent __P ((void)); #ifdef __USE_SVID /* Read a group entry from STREAM. */ -extern struct group *fgetgrent __P ((FILE * __stream)); +extern struct group *fgetgrent __P ((FILE *__stream)); #endif /* Search for an entry with a matching group ID. */ @@ -96,28 +96,28 @@ extern struct group *getgrnam __P ((__const char *__name)); may change in later versions of this library. */ #if defined(__USE_SVID) || defined(__USE_MISC) || defined (__USE_BSD) -extern struct group *getgrent_r __P ((struct group *__resultbuf, - char *buffer, int __buflen)); +extern int getgrent_r __P ((struct group *__resultbuf, char *buffer, + size_t __buflen, struct group **__result)); #endif /* Search for an entry with a matching group ID. */ -extern struct group *getgrgid_r __P ((__gid_t __gid, - struct group *__resultbuf, - char *buffer, int __buflen)); +extern int getgrgid_r __P ((__gid_t __gid, struct group *__resultbuf, + char *buffer, size_t __buflen, + struct group **__result)); /* Search for an entry with a matching group name. */ -extern struct group *getgrnam_r __P ((__const char *__name, - struct group *__resultbuf, - char *buffer, int __buflen)); +extern int getgrnam_r __P ((__const char *__name, struct group *__resultbuf, + char *buffer, size_t __buflen, + struct group **__result)); #ifdef __USE_SVID /* Read a group entry from STREAM. */ -extern struct group *__fgetgrent_r __P ((FILE * __stream, - struct group *__resultbuf, - char *buffer, int __buflen)); -extern struct group *fgetgrent_r __P ((FILE * __stream, - struct group *__resultbuf, - char *buffer, int __buflen)); +extern int __fgetgrent_r __P ((FILE * __stream, struct group *__resultbuf, + char *buffer, size_t __buflen, + struct group **__result)); +extern int fgetgrent_r __P ((FILE * __stream, struct group *__resultbuf, + char *buffer, size_t __buflen, + struct group **__result)); #endif #endif /* reentrant */ @@ -129,12 +129,12 @@ extern struct group *fgetgrent_r __P ((FILE * __stream, #include <stddef.h> /* Set the group set for the current user to GROUPS (N of them). */ -extern int setgroups __P ((size_t __n, __const __gid_t * groups)); +extern int setgroups __P ((size_t __n, __const __gid_t *__groups)); /* Initialize the group set for the current user by reading the group database and using all groups of which USER is a member. Also include GROUP. */ -extern int initgroups __P ((__const char *user, __gid_t group)); +extern int initgroups __P ((__const char *__user, __gid_t __group)); #endif /* Use BSD. */ diff --git a/grp/testgrp.c b/grp/testgrp.c index 3fac6b9bbf..62ba4e4a62 100644 --- a/grp/testgrp.c +++ b/grp/testgrp.c @@ -10,7 +10,7 @@ main (int argc, char *argv[]) { uid_t me; struct passwd *my_passwd; - struct group *my_group; + struct group *my_group = NULL; char **members; me = getuid (); |