home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright 1990, John F. Haugh II
- * All rights reserved.
- *
- * Non-commercial distribution permitted. You must provide this source
- * code in any distribution. This notice must remain intact.
- */
-
- #include <stdio.h>
- #include <grp.h>
- #include <string.h>
- #include "config.h"
- #ifdef DBM
- #include <dbm.h>
- #endif
-
- #ifndef lint
- static char _sccsid[] = "@(#)grent.c 3.1 08:52:58 11/15/90";
- #endif
-
- #define NFIELDS 4
- #define MAXMEM 1024
-
- static char grpbuf[4*BUFSIZ];
- static char *grpfields[NFIELDS];
- static char *members[MAXMEM+1];
-
- static char **
- list (s)
- char *s;
- {
- int nmembers = 0;
-
- while (*s) {
- members[nmembers++] = s;
- if (s = strchr (s, ','))
- *s++ = '\0';
- }
- members[nmembers] = (char *) 0;
- return members;
- }
-
- struct group *sgetgrent (buf)
- char *buf;
- {
- int i;
- char *cp;
- static struct group grent;
-
- strncpy (grpbuf, buf, sizeof grpbuf);
- grpbuf[sizeof grpbuf - 1] = '\0';
- if (cp = strrchr (grpbuf, '\n'))
- *cp = '\0';
-
- for (cp = grpbuf, i = 0;i < NFIELDS && cp;i++) {
- grpfields[i] = cp;
- if (cp = strchr (cp, ':'))
- *cp++ = 0;
- }
- if (i < (NFIELDS-1) || *grpfields[2] == '\0')
- return ((struct group *) 0);
-
- grent.gr_name = grpfields[0];
- grent.gr_passwd = grpfields[1];
- grent.gr_gid = atoi (grpfields[2]);
- grent.gr_mem = list (grpfields[3]);
-
- return (&grent);
- }
-
- int
- putgrent (g, f)
- struct group *g;
- FILE *f;
- {
- int i;
- char *cp;
-
- if (! g || ! f)
- return -1;
-
- sprintf (grpbuf, "%s:%s:%d:", g->gr_name, g->gr_passwd, g->gr_gid);
- if (g->gr_mem) {
- cp = strchr (grpbuf, '\0');
- for (i = 0;g->gr_mem[i];i++) {
- if (cp - grpbuf + strlen (g->gr_mem[i]) + 2
- >= sizeof grpbuf)
- return -1;
-
- if (i > 0) {
- strcpy (cp, ",");
- cp = strchr (cp, '\0');
- }
- strcpy (cp, g->gr_mem[i]);
- cp = strchr (cp, '\0');
- }
- strcat (cp, "\n");
- } else
- strcat (grpbuf, "\n");
-
- if (fputs (grpbuf, f) == EOF || ferror (f))
- return -1;
-
- return 0;
- }
-