|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: char copyright[] = ! 9: "@(#) Copyright (c) 1983 Regents of the University of California.\n\ ! 10: All rights reserved.\n"; ! 11: #endif not lint ! 12: ! 13: #ifndef lint ! 14: static char sccsid[] = "@(#)fingerd.c 5.1 (Berkeley) 6/6/85"; ! 15: #endif not lint ! 16: ! 17: /* ! 18: * Finger server. ! 19: */ ! 20: #include <sys/types.h> ! 21: #include <netinet/in.h> ! 22: ! 23: #include <stdio.h> ! 24: #include <ctype.h> ! 25: ! 26: main(argc, argv) ! 27: char *argv[]; ! 28: { ! 29: register char *sp; ! 30: char line[512]; ! 31: struct sockaddr_in sin; ! 32: int i, p[2], pid, status; ! 33: FILE *fp; ! 34: char *av[4]; ! 35: ! 36: i = sizeof (sin); ! 37: if (getpeername(0, &sin, &i) < 0) ! 38: fatal(argv[0], "getpeername"); ! 39: line[0] = '\0'; ! 40: gets(line); ! 41: sp = line; ! 42: av[0] = "finger"; ! 43: i = 1; ! 44: while (1) { ! 45: while (isspace(*sp)) ! 46: sp++; ! 47: if (!*sp) ! 48: break; ! 49: if (*sp == '/' && (sp[1] == 'W' || sp[1] == 'w')) { ! 50: sp += 2; ! 51: av[i++] = "-l"; ! 52: } ! 53: if (*sp && !isspace(*sp)) { ! 54: av[i++] = sp; ! 55: while (*sp && !isspace(*sp)) ! 56: sp++; ! 57: *sp = '\0'; ! 58: } ! 59: } ! 60: av[i] = 0; ! 61: if (pipe(p) < 0) ! 62: fatal(argv[0], "pipe"); ! 63: if ((pid = fork()) == 0) { ! 64: close(p[0]); ! 65: if (p[1] != 1) { ! 66: dup2(p[1], 1); ! 67: close(p[1]); ! 68: } ! 69: execv("/usr/ucb/finger", av); ! 70: _exit(1); ! 71: } ! 72: if (pid == -1) ! 73: fatal(argv[0], "fork"); ! 74: close(p[1]); ! 75: if ((fp = fdopen(p[0], "r")) == NULL) ! 76: fatal(argv[0], "fdopen"); ! 77: while ((i = getc(fp)) != EOF) { ! 78: if (i == '\n') ! 79: putchar('\r'); ! 80: putchar(i); ! 81: } ! 82: fclose(fp); ! 83: while ((i = wait(&status)) != pid && i != -1) ! 84: ; ! 85: return(0); ! 86: } ! 87: ! 88: fatal(prog, s) ! 89: char *prog, *s; ! 90: { ! 91: ! 92: fprintf(stderr, "%s: ", prog); ! 93: perror(s); ! 94: exit(1); ! 95: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.