Annotation of coherent/b/lib/libc/gen/getgrent.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Coherent I/O Library.
                      3:  * Routines to get the group file entry.
                      4:  * (searches by next entry, name or numerical id).
                      5:  */
                      6: 
                      7: #include <stdio.h>
                      8: #include <grp.h>
                      9: 
                     10: #define field(x)       { x=cp; while (*cp++); }
                     11: #define        NGRPLINE        256
                     12: #define        NGRMEM          64              /* Maximum no. of members in a group */
                     13: #define        GRFILE  "/etc/group"
                     14: 
                     15: static char    grline[NGRPLINE];
                     16: static char    *grmems[NGRMEM+1];
                     17: static struct  group gr;
                     18: static FILE    *grfile = { NULL };
                     19: 
                     20: struct group *
                     21: getgrnam(name)
                     22: char *name;
                     23: {
                     24:        register struct group *grp;
                     25: 
                     26:        setgrent();
                     27:        while ((grp = getgrent()) != NULL)
                     28:                if (streq(name, grp->gr_name))
                     29:                        return (grp);
                     30:        return (NULL);
                     31: }
                     32: 
                     33: struct group *
                     34: getgrgid(gid)
                     35: {
                     36:        register struct group *grp;
                     37: 
                     38:        setgrent();
                     39:        while ((grp = getgrent()) != NULL)
                     40:                if (gid == grp->gr_gid)
                     41:                        return (grp);
                     42:        return (NULL);
                     43: }
                     44: 
                     45: struct group *
                     46: getgrent()
                     47: {
                     48:        register char *cp, *xp;
                     49: 
                     50:        if (grfile == NULL)
                     51:                if ((grfile = fopen(GRFILE, "r")) == NULL)
                     52:                        return (NULL);
                     53:        cp = grline;
                     54:        {
                     55:                register int c;
                     56: 
                     57:                while ((c = getc(grfile))!=EOF && c!='\n') {
                     58:                        if (c == ':')
                     59:                                c = '\0';
                     60:                        if (cp < &grline[NGRPLINE-1])
                     61:                                *cp++ = c;
                     62:                }
                     63:                if (c == EOF)
                     64:                        return (NULL);
                     65:        }
                     66:        *cp = '\0';
                     67:        cp = grline;
                     68:        field(gr.gr_name);
                     69:        field(gr.gr_passwd);
                     70:        field(xp);
                     71:        gr.gr_gid = atoi(xp);
                     72:        {
                     73:                register char **mp;
                     74: 
                     75:                gr.gr_mem = mp = grmems;
                     76:                for (;;) {
                     77:                        if (*cp == '\0')
                     78:                                break;
                     79:                        *mp++ = cp;
                     80:                        while (*cp!=',' && *cp!='\0')
                     81:                                cp++;
                     82:                        if (*cp == ',')
                     83:                                *cp++ = '\0';
                     84:                }
                     85:                *mp = NULL;
                     86:        }
                     87:        return (&gr);
                     88: }
                     89: 
                     90: setgrent()
                     91: {
                     92:        if (grfile != NULL)
                     93:                rewind(grfile);
                     94: }
                     95: 
                     96: endgrent()
                     97: {
                     98:        if (grfile != NULL) {
                     99:                fclose(grfile);
                    100:                grfile = NULL;
                    101:        }
                    102: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.