xref: /original-bsd/libexec/fingerd/fingerd.c (revision 7e7b101a)
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