Annotation of 42BSD/usr.lib/sendmail/aux/getpwwho.c, revision 1.1

1.1     ! root        1: From James.Gosling@CMU-VLSI@CMU-10A  Thu Sep 10 07:13:52 1981
        !             2: Date: 10 Sep 1981 10:07:48-EDT
        !             3: From: James.Gosling at CMU-VLSI at CMU-10A
        !             4: Reply-To: James.Gosling at CMU-10A
        !             5: To: IngVAX.eric@Berkeley
        !             6: Subject: getpwwho.c
        !             7: Status: R
        !             8: 
        !             9: /*
        !            10:  **********************************************************************
        !            11:  * HISTORY
        !            12:  * 11-Dec-80  Mike Accetta(mja) at Carnegie-Mellon University
        !            13:  *     Changed to convert all separator characters to spaces when
        !            14:  *     copying name into internal buffer so that dots in names with
        !            15:  *     more than two parts will match password file entries.
        !            16:  *
        !            17:  * 03-Dec-80  Mike Accetta (mja) at Carnegie-Mellon University
        !            18:  *     Changed to treat everything before last blank in name as first
        !            19:  *     name and modified to close password file when called with null
        !            20:  *     pointer.
        !            21:  *
        !            22:  * 29-Nov-80  Mike Accetta (mja) at Carnegie-Mellon University
        !            23:  *     Changed to allow '.' as separator in names.
        !            24:  *
        !            25:  * 07-Nov-80  Mike Accetta (mja) at Carnegie-Mellon University
        !            26:  *     Removed reference to (extinct) alias name.
        !            27:  *
        !            28:  **********************************************************************
        !            29:  */
        !            30: 
        !            31: #include <stdio.h>
        !            32: #include <ctype.h>
        !            33: #include <pwd.h>
        !            34: #include <gecos.h>
        !            35: 
        !            36: #define        dotisspace(c)   (isspace(c) || (c) == '.')
        !            37: 
        !            38: struct gecos *parsgecos();
        !            39: 
        !            40: static char PASSWD[]   = "/etc/passwd";
        !            41: static char EMPTY[] = "";
        !            42: static FILE *pwf = NULL;
        !            43: static char line[BUFSIZ+1], auxline[BUFSIZ+1];
        !            44: static struct passwd passwd, auxpasswd;
        !            45: static struct gecos auxgecos;
        !            46: static int ambigstate;
        !            47: 
        !            48: static setpwent()
        !            49: {
        !            50:        if( pwf == NULL )
        !            51:                pwf = fopen( PASSWD, "r" );
        !            52:        else
        !            53:                rewind( pwf );
        !            54: }
        !            55: 
        !            56: static endpwent()
        !            57: {
        !            58:        if( pwf != NULL ){
        !            59:                fclose( pwf );
        !            60:                pwf = NULL;
        !            61:        }
        !            62: }
        !            63: 
        !            64: static char *
        !            65: pwskip(p)
        !            66: register char *p;
        !            67: {
        !            68:        while( *p && *p != ':' )
        !            69:                ++p;
        !            70:        if( *p ) *p++ = 0;
        !            71:        return(p);
        !            72: }
        !            73: 
        !            74: static struct passwd *getpwent(passwd,line)
        !            75: register struct passwd *passwd;
        !            76: char * line;
        !            77: {
        !            78:        register char *p;
        !            79: 
        !            80:        if (pwf == NULL) {
        !            81:                if( (pwf = fopen( PASSWD, "r" )) == NULL )
        !            82:                        return(0);
        !            83:        }
        !            84:        p = fgets(line, BUFSIZ, pwf);
        !            85:        if (p==NULL)
        !            86:                return(0);
        !            87:        passwd->pw_name = p;
        !            88:        p = pwskip(p);
        !            89:        passwd->pw_passwd = p;
        !            90:        p = pwskip(p);
        !            91:        passwd->pw_uid = atoi(p);
        !            92:        p = pwskip(p);
        !            93:        passwd->pw_gid = atoi(p);
        !            94:        passwd->pw_quota = 0;
        !            95:        passwd->pw_comment = EMPTY;
        !            96:        p = pwskip(p);
        !            97:        passwd->pw_gecos = p;
        !            98:        p = pwskip(p);
        !            99:        passwd->pw_dir = p;
        !           100:        p = pwskip(p);
        !           101:        passwd->pw_shell = p;
        !           102:        while(*p && *p != '\n') p++;
        !           103:        *p = '\0';
        !           104:        return(passwd);
        !           105: }
        !           106: 
        !           107: struct gecos *_gecos;
        !           108: 
        !           109: static char name1[100], name2[100];
        !           110: static int name1l, name2l;
        !           111: 
        !           112: static scanpw (pw, buf)
        !           113: register struct passwd *pw;
        !           114: char   *buf;
        !           115: {
        !           116:     register struct gecos  *ge;
        !           117:     register char  *cp;
        !           118: 
        !           119:     while (getpwent (pw, buf)) {
        !           120:        _gecos = ge = parsgecos (pw -> pw_gecos);
        !           121:        if (*name1 == '\0' && strcmp (name2, pw -> pw_name) == 0)
        !           122:            return 1;
        !           123:        if (IsName (ge -> pw_who))
        !           124:            return 2;
        !           125:     }
        !           126:     return 0;
        !           127: }
        !           128: 
        !           129: static  IsName (name)
        !           130: char   *name; {
        !           131:     register char  *p1,
        !           132:                    *p2;
        !           133:     if (!FoldedEQ (name, name1, name1l))
        !           134:        return (0);
        !           135:     p1 = p2 = name;
        !           136:     while (*p2){
        !           137:        if (dotisspace (*p2))
        !           138:            p1 = p2+1;
        !           139:        p2++;
        !           140:     }
        !           141:     return (FoldedEQ (p1, name2, name2l));
        !           142: }
        !           143: 
        !           144: struct passwd  *
        !           145: getpwwho (name)
        !           146: char   *name; {
        !           147:     register char *s, *d;
        !           148:     ambigstate = -1;
        !           149:     if (name == NULL)
        !           150:     {
        !           151:        endpwent();
        !           152:        return(0);
        !           153:     }
        !           154:     s = d = name2;
        !           155:     name1[0] = '\0';
        !           156:     strcpy(name2, name);
        !           157:     for(; *d; d++)
        !           158:        if (dotisspace(*d)) {
        !           159:            *d = ' ';
        !           160:            s = d;
        !           161:        }
        !           162:     if(dotisspace(*s)){
        !           163:        *s++ = 0;
        !           164:        strcpy (name1, name2);
        !           165:        strcpy (name2, s);
        !           166:     }
        !           167:     name1l = strlen (name1);
        !           168:     name2l = strlen (name2);
        !           169:     setpwent ();
        !           170:     switch (scanpw (&passwd, line)) {
        !           171:        case 0: 
        !           172:            return (0);
        !           173:        case 1: 
        !           174:            return (&passwd);
        !           175:        default: ;
        !           176:     }
        !           177:     auxgecos = *_gecos;
        !           178:     while (1) {
        !           179:        switch (scanpw (&auxpasswd, auxline)) {
        !           180:            case 0: 
        !           181:                if (ambigstate == -1) {
        !           182:                    _gecos = &auxgecos;
        !           183:                    return & passwd;
        !           184:                }
        !           185:                return (struct passwd  *) - 1;
        !           186:            case 1: 
        !           187:                return & auxpasswd;
        !           188:            case 2: 
        !           189:                ambigstate = 0;
        !           190:                break;
        !           191:        }
        !           192:     }
        !           193:     /*  NOTREACHED */
        !           194: }
        !           195: 
        !           196: struct passwd  *getpwambig () {
        !           197:     if (ambigstate < 0)
        !           198:        return 0;
        !           199:     if (ambigstate++ == 0)
        !           200:        setpwent();
        !           201:     if (!scanpw (&passwd, line)) {
        !           202:        ambigstate = -1;
        !           203:        return 0;
        !           204:     }
        !           205:     return & passwd;
        !           206: }
        !           207: 
        !           208: static FoldedEQ(s1,s2,len)
        !           209: register char *s1,*s2;
        !           210: register len; {
        !           211:        while(--len>=0 && *s1 && (isupper(*s1) ? tolower(*s1) : *s1)
        !           212:                              == (isupper(*s2) ? tolower(*s2) : *s2))
        !           213:                s1++, s2++;
        !           214:        return len<0 || *s1==0 && *s2==0;
        !           215: }
        !           216: 
        !           217: 

unix.superglobalmegacorp.com

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