|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that: (1) source distributions retain this entire copyright ! 7: * notice and comment, and (2) distributions including binaries display ! 8: * the following acknowledgement: ``This product includes software ! 9: * developed by the University of California, Berkeley and its contributors'' ! 10: * in the documentation or other materials provided with the distribution ! 11: * and in all advertising materials mentioning features or use of this ! 12: * software. Neither the name of the University nor the names of its ! 13: * contributors may be used to endorse or promote products derived ! 14: * from this software without specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: char copyright[] = ! 22: "@(#) Copyright (c) 1983 The Regents of the University of California.\n\ ! 23: All rights reserved.\n"; ! 24: #endif /* not lint */ ! 25: ! 26: #ifndef lint ! 27: static char sccsid[] = "@(#)fingerd.c 5.6 (Berkeley) 6/1/90"; ! 28: #endif /* not lint */ ! 29: ! 30: #include <stdio.h> ! 31: #include "pathnames.h" ! 32: ! 33: main() ! 34: { ! 35: register FILE *fp; ! 36: register int ch; ! 37: register char *lp; ! 38: int p[2]; ! 39: #define ENTRIES 50 ! 40: char **ap, *av[ENTRIES + 1], line[1024], *strtok(); ! 41: ! 42: #ifdef LOGGING /* unused for now */ ! 43: #include <netinet/in.h> ! 44: struct sockaddr_in sin; ! 45: int sval; ! 46: ! 47: sval = sizeof(sin); ! 48: if (getpeername(0, &sin, &sval) < 0) ! 49: fatal("getpeername"); ! 50: #endif ! 51: ! 52: if (!fgets(line, sizeof(line), stdin)) ! 53: exit(1); ! 54: ! 55: av[0] = "finger"; ! 56: for (lp = line, ap = &av[1];;) { ! 57: *ap = strtok(lp, " \t\r\n"); ! 58: if (!*ap) ! 59: break; ! 60: /* RFC742: "/[Ww]" == "-l" */ ! 61: if ((*ap)[0] == '/' && ((*ap)[1] == 'W' || (*ap)[1] == 'w')) ! 62: *ap = "-l"; ! 63: if (++ap == av + ENTRIES) ! 64: break; ! 65: lp = NULL; ! 66: } ! 67: ! 68: if (pipe(p) < 0) ! 69: fatal("pipe"); ! 70: ! 71: switch(fork()) { ! 72: case 0: ! 73: (void)close(p[0]); ! 74: if (p[1] != 1) { ! 75: (void)dup2(p[1], 1); ! 76: (void)close(p[1]); ! 77: } ! 78: execv(_PATH_FINGER, av); ! 79: _exit(1); ! 80: case -1: ! 81: fatal("fork"); ! 82: } ! 83: (void)close(p[1]); ! 84: if (!(fp = fdopen(p[0], "r"))) ! 85: fatal("fdopen"); ! 86: while ((ch = getc(fp)) != EOF) { ! 87: if (ch == '\n') ! 88: putchar('\r'); ! 89: putchar(ch); ! 90: } ! 91: exit(0); ! 92: } ! 93: ! 94: fatal(msg) ! 95: char *msg; ! 96: { ! 97: extern int errno; ! 98: char *strerror(); ! 99: ! 100: fprintf(stderr, "fingerd: %s: %s\r\n", msg, strerror(errno)); ! 101: exit(1); ! 102: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.