BSD 4_3 release
[unix-history] / usr / src / etc / fingerd.c
CommitLineData
da158ee3
DF
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
8char copyright[] =
9"@(#) Copyright (c) 1983 Regents of the University of California.\n\
10 All rights reserved.\n";
11#endif not lint
12
0f6570f2 13#ifndef lint
95f51977 14static char sccsid[] = "@(#)fingerd.c 5.1 (Berkeley) 6/6/85";
da158ee3 15#endif not lint
0f6570f2
SL
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
26main(argc, argv)
27 char *argv[];
28{
d65ec3aa
RC
29 register char *sp;
30 char line[512];
0f6570f2 31 struct sockaddr_in sin;
d65ec3aa 32 int i, p[2], pid, status;
0b751098 33 FILE *fp;
d65ec3aa 34 char *av[4];
0f6570f2
SL
35
36 i = sizeof (sin);
37 if (getpeername(0, &sin, &i) < 0)
38 fatal(argv[0], "getpeername");
39 line[0] = '\0';
40 gets(line);
0b751098 41 sp = line;
d65ec3aa
RC
42 av[0] = "finger";
43 i = 1;
0f6570f2 44 while (1) {
0b751098
RC
45 while (isspace(*sp))
46 sp++;
47 if (!*sp)
0f6570f2 48 break;
0b751098
RC
49 if (*sp == '/' && (sp[1] == 'W' || sp[1] == 'w')) {
50 sp += 2;
d65ec3aa
RC
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]);
0f6570f2 68 }
d65ec3aa
RC
69 execv("/usr/ucb/finger", av);
70 _exit(1);
0b751098 71 }
d65ec3aa
RC
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");
0b751098
RC
77 while ((i = getc(fp)) != EOF) {
78 if (i == '\n')
79 putchar('\r');
80 putchar(i);
0f6570f2 81 }
d65ec3aa
RC
82 fclose(fp);
83 while ((i = wait(&status)) != pid && i != -1)
84 ;
0b751098 85 return(0);
0f6570f2
SL
86}
87
88fatal(prog, s)
89 char *prog, *s;
90{
91
92 fprintf(stderr, "%s: ", prog);
93 perror(s);
94 exit(1);
95}