From c3d20eba96e9c26f775f3abf5ca6edcbd8c23963 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 2 Jul 1999 18:03:43 +0000 Subject: Reentrant versions added by Joel. Signficant formatting cleanup. --- c/src/lib/libc/getgrent.c | 136 ++++++++++++++++++++++++++++------------------ 1 file changed, 84 insertions(+), 52 deletions(-) (limited to 'c/src/lib/libc/getgrent.c') diff --git a/c/src/lib/libc/getgrent.c b/c/src/lib/libc/getgrent.c index 080187d178..d0a92a0b80 100644 --- a/c/src/lib/libc/getgrent.c +++ b/c/src/lib/libc/getgrent.c @@ -11,7 +11,7 @@ #include #include -static struct group gr_group; /* password structure */ +static struct group gr_group; /* password structure */ static FILE *group_fp; static char groupname[8]; @@ -19,70 +19,102 @@ static char password[1024]; static char groups[1024]; static char *gr_mem[16] = { } ; -struct group * -getgrnam (name) - const char *name; +int getgrnam_r( + const char *name, + struct group *grp, + char *buffer, + size_t bufsize, + struct group **result +) { FILE *fp; - char buf[1024]; - - if ((fp = fopen ("/etc/group", "r")) == NULL) - { - return NULL; - } - while (fgets (buf, sizeof (buf), fp)) - { - sscanf (buf, "%[^:]:%[^:]:%d:%s\n", - groupname, password, &gr_group.gr_gid, - groups); - gr_group.gr_name = groupname; - gr_group.gr_passwd = password; - gr_group.gr_mem = gr_mem ; - - if (!strcmp (groupname, name)) - { - fclose (fp); - return &gr_group; - } + if ((fp = fopen ("/etc/group", "r")) == NULL) { + errno = EINVAL; + return -1; + } + + while (fgets (buffer, bufsize, fp)) { + sscanf (buffer, "%[^:]:%[^:]:%d:%s\n", + groupname, password, &grp->gr_gid, + groups); + grp->gr_name = groupname; + grp->gr_passwd = password; + grp->gr_mem = gr_mem ; + + if (!strcmp (groupname, name)) { + fclose (fp); + *result = grp; + return 0; } + } fclose (fp); - return NULL; + errno = EINVAL; + return -1; +} + +struct group *getgrnam( + const char *name +) +{ + char buf[1024]; + struct group *g; + + if ( getgrnam_r( name, &gr_group, buf, 1024, &g ) ) + return NULL; + + return g; } -struct group * -getgrgid (gid_t gid) +int getgrgid_r( + gid_t gid, + struct group *grp, + char *buffer, + size_t bufsize, + struct group **result +) { FILE *fp; - char buf[1024]; - if ((fp = fopen ("/etc/group", "r")) == NULL) - { - return NULL; - } + if ((fp = fopen ("/etc/group", "r")) == NULL) { + errno = EINVAL; + return -1; + } + + while (fgets (buffer, bufsize, fp)) { + sscanf (buffer, "%[^:]:%[^:]:%d:%s\n", + groupname, password, &gr_group.gr_gid, + groups); + gr_group.gr_name = groupname; + gr_group.gr_passwd = password; + gr_group.gr_mem = gr_mem ; + - while (fgets (buf, sizeof (buf), fp)) - { - sscanf (buf, "%[^:]:%[^:]:%d:%s\n", - groupname, password, &gr_group.gr_gid, - groups); - gr_group.gr_name = groupname; - gr_group.gr_passwd = password; - gr_group.gr_mem = gr_mem ; - - - if (gid == gr_group.gr_gid) - { - fclose (fp); - return &gr_group; - } + if (gid == gr_group.gr_gid) { + fclose (fp); + *result = grp; + return 0; } + } fclose (fp); - return NULL; + errno = EINVAL; + return -1; +} + +struct group *getgrgid ( + gid_t gid +) +{ + char buf[1024]; + struct group *g; + + if ( getgrgid_r( gid, &gr_group, buf, 1024, &g ) ) + return NULL; + + return g; } -struct group * -getgrent () +struct group *getgrent( void ) { char buf[1024]; @@ -93,8 +125,8 @@ getgrent () return NULL; sscanf (buf, "%[^:]:%[^:]:%d:%s\n", - groupname, password, &gr_group.gr_gid, - groups); + groupname, password, &gr_group.gr_gid, + groups); gr_group.gr_name = groupname; gr_group.gr_passwd = password; gr_group.gr_mem = gr_mem ; -- cgit v1.2.3