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) 06/06/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 } 96