diff options
author | Roland McGrath <roland@gnu.org> | 1991-07-15 22:55:48 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 1991-07-15 22:55:48 +0000 |
commit | 3dede7fd04341ab01d11de537e736d949aa4540e (patch) | |
tree | abf3074966c43d1e44933b63a49a4d2e6ff2eb4b /grp | |
parent | 3928cc01690ff2925e8c305a88a479f415c66a2c (diff) |
Formerly ../grp/grpread.c.~4~
Diffstat (limited to 'grp')
-rw-r--r-- | grp/grpread.c | 61 |
1 files changed, 45 insertions, 16 deletions
diff --git a/grp/grpread.c b/grp/grpread.c index fe3ad00d4f..bf288a5899 100644 --- a/grp/grpread.c +++ b/grp/grpread.c @@ -22,6 +22,7 @@ Cambridge, MA 02139, USA. */ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/types.h> #include <grp.h> /* This is the function that all the others are based on. @@ -30,10 +31,10 @@ Cambridge, MA 02139, USA. */ /* Structure containing info kept by each __grpread caller. */ typedef struct { -#define NAME_SIZE 9 -#define PASSWD_SIZE 21 -#define MEMLIST_SIZE 1001 - char name[NAME_SIZE], passwd[PASSWD_SIZE], memlist[MEMLIST_SIZE]; +#define NAME_SIZE 8 +#define PASSWD_SIZE 20 +#define MEMLIST_SIZE 1000 + char buf[NAME_SIZE + 1 + PASSWD_SIZE + 1 + 20 + 1 + 20 + MEMLIST_SIZE + 1]; size_t max_members; char **members; struct group g; @@ -64,8 +65,8 @@ struct group * DEFUN(__grpread, (stream, g), FILE *stream AND PTR CONST g) { register grpread_info *CONST info = (grpread_info *) g; + char *start, *end; register size_t i; - register char *s; /* Idiocy checks. */ if (stream == NULL) @@ -74,30 +75,58 @@ DEFUN(__grpread, (stream, g), FILE *stream AND PTR CONST g) return NULL; } - if (fscanf(stream, "%8[^:]:%20[^:]:%hd:%1000[^\n]\n", - info->name, info->passwd, &info->g.gr_gid, info->memlist) != 4) + if (fgets (info->buf, sizeof(info->buf), stream) == NULL) + return NULL; + + start = info->buf; + end = strchr (start, ':'); + if (end == NULL) + return NULL; + *end = '\0'; + info->g.gr_name = start; + + start = end + 1; + end = strchr (start, ':'); + if (end == NULL) + return NULL; + *end = '\0'; + info->g.gr_passwd = start; + + info->g.gr_gid = (gid_t) strtol (end + 1, &end, 10); + if (*end != ':') return NULL; - /* Turn the comma-separated list into an array. */ i = 0; - for (s = strtok(info->memlist, ","); s != NULL; - s = strtok((char *) NULL, ",")) + do { + start = end + 1; + end = strchr (start, ','); + if (end == NULL) + { + end = strchr (start, '\n'); + if (end == start) + break; + if (end == NULL) + return NULL; + *end = '\0'; + end = NULL; + } + else + *end = '\0'; + if (i == info->max_members - 2) { info->max_members += 5; info->members = (char **) - realloc((PTR) info->members, info->max_members * sizeof(char *)); + realloc ((PTR) info->members, info->max_members * sizeof (char *)); if (info->members == NULL) return NULL; } - info->members[i++] = s; - } + info->members[i++] = start; + } while (end != NULL); info->members[i] = NULL; - - info->g.gr_name = info->name; - info->g.gr_passwd = info->passwd; info->g.gr_mem = info->members; + return &info->g; } |