|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.