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