Commit | Line | Data |
---|---|---|
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 | |
8 | char 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 | 14 | static 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 | ||
26 | main(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 | ||
88 | fatal(prog, s) | |
89 | char *prog, *s; | |
90 | { | |
91 | ||
92 | fprintf(stderr, "%s: ", prog); | |
93 | perror(s); | |
94 | exit(1); | |
95 | } |