1 #ifndef lint 2 static char sccsid[] = "@(#)fingerd.c 1.3 (Berkeley) 07/26/84"; 3 #endif 4 5 /* 6 * Finger server. 7 */ 8 #include <sys/types.h> 9 #include <netinet/in.h> 10 11 #include <stdio.h> 12 #include <ctype.h> 13 14 main(argc, argv) 15 char *argv[]; 16 { 17 register char *sp; 18 char line[512]; 19 struct sockaddr_in sin; 20 int i, p[2], pid, status; 21 FILE *fp; 22 char *av[4]; 23 24 i = sizeof (sin); 25 if (getpeername(0, &sin, &i) < 0) 26 fatal(argv[0], "getpeername"); 27 line[0] = '\0'; 28 gets(line); 29 sp = line; 30 av[0] = "finger"; 31 i = 1; 32 while (1) { 33 while (isspace(*sp)) 34 sp++; 35 if (!*sp) 36 break; 37 if (*sp == '/' && (sp[1] == 'W' || sp[1] == 'w')) { 38 sp += 2; 39 av[i++] = "-l"; 40 } 41 if (*sp && !isspace(*sp)) { 42 av[i++] = sp; 43 while (*sp && !isspace(*sp)) 44 sp++; 45 *sp = '\0'; 46 } 47 } 48 av[i] = 0; 49 if (pipe(p) < 0) 50 fatal(argv[0], "pipe"); 51 if ((pid = fork()) == 0) { 52 close(p[0]); 53 if (p[1] != 1) { 54 dup2(p[1], 1); 55 close(p[1]); 56 } 57 execv("/usr/ucb/finger", av); 58 _exit(1); 59 } 60 if (pid == -1) 61 fatal(argv[0], "fork"); 62 close(p[1]); 63 if ((fp = fdopen(p[0], "r")) == NULL) 64 fatal(argv[0], "fdopen"); 65 while ((i = getc(fp)) != EOF) { 66 if (i == '\n') 67 putchar('\r'); 68 putchar(i); 69 } 70 fclose(fp); 71 while ((i = wait(&status)) != pid && i != -1) 72 ; 73 return(0); 74 } 75 76 fatal(prog, s) 77 char *prog, *s; 78 { 79 80 fprintf(stderr, "%s: ", prog); 81 perror(s); 82 exit(1); 83 } 84