Annotation of 41BSD/cmd/ucbmail/getname.c, revision 1.1.1.1

1.1       root        1: #
                      2: 
                      3: 
                      4: /*
                      5:  * Getname / getuserid for those with no
                      6:  * hashed passwd data base).
                      7:  * Do not compile this module in if you DO have hashed
                      8:  * passwd's -- this is slower.
                      9:  *
                     10:  * Also provided here is a getpw routine which can share
                     11:  * the open file.  This is used for the Version 6 getenv
                     12:  * implementation.
                     13:  */
                     14: 
                     15: #include "rcv.h"
                     16: 
                     17: static FILE *pwfile =  NULL;           /* Pw file held open */
                     18: static char *pwname =  "/etc/passwd";  /* Name of passwd file */
                     19: 
                     20: /*
                     21:  * Search the passwd file for a uid.  Return name through ref parameter
                     22:  * if found, indicating success with 0 return.  Return -1 on error.
                     23:  * If -1 is passed as the user id, close the passwd file.
                     24:  */
                     25: 
                     26: getname(uid, namebuf)
                     27:        char namebuf[];
                     28: {
                     29:        register char *cp, *cp2;
                     30:        char linebuf[BUFSIZ];
                     31: 
                     32:        if (uid == -1) {
                     33:                if (pwfile != NULL)
                     34:                        fclose(pwfile);
                     35:                pwfile = NULL;
                     36:                return(0);
                     37:        }
                     38:        if (pwfile == NULL && (pwfile = fopen(pwname, "r")) == NULL)
                     39:                return(-1);
                     40:        rewind(pwfile);
                     41:        while (fgets(linebuf, BUFSIZ, pwfile) != NULL)
                     42:                if (pweval(linebuf) == uid) {
                     43:                        for (cp = linebuf, cp2 = namebuf; *cp != ':';
                     44:                            *cp2++ = *cp++)
                     45:                                ;
                     46:                        *cp2 = '\0';
                     47:                        return(0);
                     48:                }
                     49:        return(-1);
                     50: }
                     51: 
                     52: /*
                     53:  * Read the users password file line into the passed line
                     54:  * buffer.
                     55:  */
                     56: 
                     57: getpw(uid, linebuf)
                     58:        char linebuf[];
                     59: {
                     60:        register char *cp, *cp2;
                     61: 
                     62:        if (uid == -1) {
                     63:                if (pwfile != NULL)
                     64:                        fclose(pwfile);
                     65:                pwfile = NULL;
                     66:                return(0);
                     67:        }
                     68:        if (pwfile == NULL && (pwfile = fopen(pwname, "r")) == NULL)
                     69:                return(-1);
                     70:        rewind(pwfile);
                     71:        while (fgets(linebuf, BUFSIZ, pwfile) != NULL)
                     72:                if (pweval(linebuf) == uid) {
                     73:                        if (linebuf[0] != '\0')
                     74:                                linebuf[strlen(linebuf)-1] = '\0';
                     75:                        return(0);
                     76:                }
                     77:        return(-1);
                     78: }
                     79: 
                     80: /*
                     81:  * Look for passwd line belonging to 'name'
                     82:  */
                     83: 
                     84: getpwnam(name, linebuf)
                     85:        char name[], linebuf[];
                     86: {
                     87:        register char *cp, *cp2;
                     88: 
                     89:        if (name == NOSTR) {
                     90:                if (pwfile != NULL)
                     91:                        fclose(pwfile);
                     92:                pwfile = NULL;
                     93:                return(0);
                     94:        }
                     95:        if (pwfile == NULL && (pwfile = fopen(pwname, "r")) == NULL) {
                     96:                perror(pwname);
                     97:                return(-1);
                     98:        }
                     99:        rewind(pwfile);
                    100:        while (fgets(linebuf, BUFSIZ, pwfile) != NULL) {
                    101:                cp = linebuf;
                    102:                cp2 = name;
                    103:                while (*cp2++ == *cp++)
                    104:                        ;
                    105:                if (*--cp == ':' && *--cp2 == 0)
                    106:                        return(0);
                    107:        }
                    108:        return(-1);
                    109: }
                    110: 
                    111: /*
                    112:  * Convert the passed name to a user id and return it.  Return -1
                    113:  * on error.  Iff the name passed is -1 (yech) close the pwfile.
                    114:  */
                    115: 
                    116: getuserid(name)
                    117:        char name[];
                    118: {
                    119:        register char *cp, *cp2;
                    120:        char linebuf[BUFSIZ];
                    121: 
                    122:        if (name == (char *) -1) {
                    123:                if (pwfile != NULL)
                    124:                        fclose(pwfile);
                    125:                pwfile = NULL;
                    126:                return(0);
                    127:        }
                    128:        if (pwfile == NULL && (pwfile = fopen(pwname, "r")) == NULL)
                    129:                return(-1);
                    130:        rewind(pwfile);
                    131:        while (fgets(linebuf, BUFSIZ, pwfile) != NULL) {
                    132:                for (cp = name, cp2 = linebuf; *cp++ == *cp2++;)
                    133:                        ;
                    134:                if (*--cp == '\0' && *--cp2 == ':')
                    135:                        return(pweval(linebuf));
                    136:        }
                    137:        return(-1);
                    138: }
                    139: 
                    140: /*
                    141:  * Evaluate the user id of the passed passwd line and return it.
                    142:  */
                    143: 
                    144: static
                    145: pweval(line)
                    146:        char line[];
                    147: {
                    148:        register char *cp;
                    149:        register int i;
                    150:        register int uid;
                    151: 
                    152:        for (cp = line, i = 0; i < 2; i += (*cp++ == ':'))
                    153:                ;
                    154:        uid = atoi(cp);
                    155: 
                    156: #ifdef UIDGID
                    157:        while (*cp && *cp != ':')
                    158:                cp++;
                    159:        cp++;
                    160:        uid |= atoi(cp) << 8;
                    161: #endif
                    162: 
                    163:        return(uid);
                    164: }

unix.superglobalmegacorp.com

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