|
|
1.1 ! root 1: /* ! 2: * fullname.c - this file is made separate so that different local ! 3: * conventions can be applied. The stock version understands two ! 4: * conventions: ! 5: * ! 6: * (a) Berkeley finger: the gecos field in /etc/passwd begins with ! 7: * the full name, terminated with comma, semicolon, or end of ! 8: * field. & expands to the login name. ! 9: * (b) BTL RJE: the gecos field looks like ! 10: * : junk - full name ( junk : ! 11: * where the "junk -" is optional. ! 12: * ! 13: * If you have a different local convention, modify this file accordingly. ! 14: */ ! 15: ! 16: #ifdef SCCSID ! 17: static char *SccsId = "@(#)fullname.c 1.12 9/24/87"; ! 18: #endif /* SCCSID */ ! 19: ! 20: #include "params.h" ! 21: ! 22: #ifndef LOCALNAME ! 23: /* ! 24: * Figure out who is sending the message and sign it. ! 25: * We attempt to look up the user in the gecos field of /etc/passwd. ! 26: */ ! 27: char * ! 28: fullname(un) ! 29: char *un; ! 30: { ! 31: static char inbuf[BUFLEN]; ! 32: struct passwd *pw; ! 33: ! 34: pw = getpwnam(un); ! 35: if (pw == NULL) ! 36: return un; ! 37: buildfname(pw->pw_gecos, un, inbuf); ! 38: if (inbuf[0] == 0) ! 39: return un; ! 40: return inbuf; ! 41: } ! 42: ! 43: #else ! 44: ! 45: /* ! 46: * Alternative version of fullname which asks the user for his full name. ! 47: * This is mainly suitable for systems that don't have a full name ! 48: * database somewhere. It puts the answer in $HOME/.name ! 49: */ ! 50: char * ! 51: fullname(un) ! 52: char *un; ! 53: { ! 54: static char inbuf[BUFLEN]; ! 55: char fbuf[BUFLEN]; ! 56: FILE *fd; ! 57: char *p, *index(), *getenv(); ! 58: int pid; ! 59: ! 60: if (!isatty(2)) ! 61: return un; ! 62: printf("What is your full name (for news article signatures): "); ! 63: fflush(stdout); ! 64: read(2, inbuf, sizeof inbuf); ! 65: if (inbuf[0] == 0) ! 66: return un; ! 67: p = index(inbuf, '\n'); ! 68: if (p) ! 69: *p = 0; ! 70: if ((p = getenv("HOME")) == NULL) { ! 71: fprintf(stderr, ! 72: "inews: no HOME environment variable - .name not written\n"); ! 73: return inbuf; ! 74: } ! 75: sprintf(fbuf, "%s/%s", p, ".name"); ! 76: if ((pid = vfork()) < 0) { ! 77: perror("inews"); ! 78: return inbuf; ! 79: } ! 80: else if (pid != 0) ! 81: while (wait((int *)0) != pid) ! 82: ; ! 83: else { ! 84: setuid(getuid()); /* become the user */ ! 85: if ((fd = fopen(fbuf, "w")) == NULL) ! 86: fprintf(stderr, "inews: can't create %s\n", fbuf); ! 87: else { ! 88: fprintf(fd, "%s\n", inbuf); ! 89: fclose(fd); ! 90: } ! 91: exit(0); ! 92: } ! 93: return inbuf; ! 94: } ! 95: #endif ! 96: ! 97: #ifndef LOCALNAME ! 98: /* ! 99: ** BUILDFNAME -- build full name from gecos style entry. ! 100: ** (routine lifted from sendmail) ! 101: ** ! 102: ** This routine interprets the strange entry that would appear ! 103: ** in the GECOS field of the password file. ! 104: ** ! 105: ** Parameters: ! 106: ** p -- name to build. ! 107: ** login -- the login name of this user (for &). ! 108: ** buf -- place to put the result. ! 109: ** ! 110: ** Returns: ! 111: ** none. ! 112: ** ! 113: ** Side Effects: ! 114: ** none. ! 115: */ ! 116: ! 117: buildfname(p, login, buf) ! 118: register char *p; ! 119: char *login; ! 120: char *buf; ! 121: { ! 122: register char *bp = buf; ! 123: ! 124: if (*p == '*') ! 125: p++; ! 126: while (*p != '\0' && *p != ',' && *p != ';' && *p != ':' && *p != '(') ! 127: { ! 128: if (*p == '-' && isspace(p[1])) { ! 129: bp = buf; ! 130: p++; ! 131: } ! 132: else if (*p == '&') ! 133: { ! 134: strcpy(bp, login); ! 135: if ((bp == buf || !isalpha(bp[-1])) && islower(*bp)) ! 136: *bp = toupper(*bp); ! 137: while (*bp != '\0') ! 138: bp++; ! 139: p++; ! 140: } ! 141: else ! 142: *bp++ = *p++; ! 143: } ! 144: *bp = '\0'; ! 145: } ! 146: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.