|
|
1.1 ! root 1: /* ! 2: * UNIX shell - logdir routine ! 3: * ! 4: * Joe Steffen ! 5: * Bell Telephone Laboratories ! 6: * ! 7: * This routine does not use the getpwent(3) library routine ! 8: * because the latter uses the stdio package. The allocation of ! 9: * storage in this package destroys the integrity of the shell's ! 10: * storage allocation. ! 11: * ! 12: * Modified 2/82 by DJ Molny ! 13: * ! 14: * This routine now implements name cacheing, so multiple requests ! 15: * for the same logdir do not result in multiple open/reads of ! 16: * /etc/passwd. If the previous request was successful and the name ! 17: * is the same as the last request, the same login directory is returned. ! 18: */ ! 19: ! 20: #define BUFSIZ 160 ! 21: ! 22: static char line[BUFSIZ+1]; ! 23: ! 24: char * ! 25: logdir(name) ! 26: char *name; ! 27: { ! 28: int pwf; ! 29: static char lastname[BUFSIZ+1]; ! 30: static char lastdir[BUFSIZ+1]; ! 31: register char *p; ! 32: register int i, j; ! 33: char *field(); ! 34: ! 35: if (*lastdir && !strcmp(lastname,name)) /* djm */ ! 36: return(lastdir); ! 37: ! 38: strcpy(lastname,name); /* djm */ ! 39: strcpy(lastdir,""); /* djm */ ! 40: ! 41: /* attempt to open the password file */ ! 42: if ((pwf = open("/etc/passwd", 0)) == -1) ! 43: return(0); ! 44: ! 45: /* find the matching password entry */ ! 46: do { ! 47: /* get the next line in the password file */ ! 48: i = read(pwf, line, BUFSIZ); ! 49: for (j = 0; j < i; j++) ! 50: if (line[j] == '\n') ! 51: break; ! 52: /* return a null pointer if the whole file has been read */ ! 53: if (j >= i) ! 54: return(0); ! 55: line[++j] = 0; /* terminate the line */ ! 56: lseek(pwf, (long) (j - i), 1); /* point at the next line */ ! 57: p = field(line); /* get the logname */ ! 58: } while (strcmp(name, line) != 0); ! 59: close(pwf); ! 60: ! 61: /* skip the intervening fields */ ! 62: p = field(p); ! 63: p = field(p); ! 64: p = field(p); ! 65: p = field(p); ! 66: ! 67: /* return the login directory */ ! 68: field(p); ! 69: strcpy(lastdir,p); /* djm */ ! 70: return(p); ! 71: } ! 72: ! 73: static char * ! 74: field(p) ! 75: register char *p; ! 76: { ! 77: while (*p && *p != ':') ! 78: ++p; ! 79: if (*p) *p++ = 0; ! 80: return(p); ! 81: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.