|
|
1.1 root 1: /*
2: * Copyright (c) 1983 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: char copyright[] =
22: "@(#) Copyright (c) 1983 The Regents of the University of California.\n\
23: All rights reserved.\n";
24: #endif /* not lint */
25:
26: #ifndef lint
27: static char sccsid[] = "@(#)fingerd.c 5.6 (Berkeley) 6/1/90";
28: #endif /* not lint */
29:
30: #include <stdio.h>
31: #include "pathnames.h"
32:
33: main()
34: {
35: register FILE *fp;
36: register int ch;
37: register char *lp;
38: int p[2];
39: #define ENTRIES 50
40: char **ap, *av[ENTRIES + 1], line[1024], *strtok();
41:
42: #ifdef LOGGING /* unused for now */
43: #include <netinet/in.h>
44: struct sockaddr_in sin;
45: int sval;
46:
47: sval = sizeof(sin);
48: if (getpeername(0, &sin, &sval) < 0)
49: fatal("getpeername");
50: #endif
51:
52: if (!fgets(line, sizeof(line), stdin))
53: exit(1);
54:
55: av[0] = "finger";
56: for (lp = line, ap = &av[1];;) {
57: *ap = strtok(lp, " \t\r\n");
58: if (!*ap)
59: break;
60: /* RFC742: "/[Ww]" == "-l" */
61: if ((*ap)[0] == '/' && ((*ap)[1] == 'W' || (*ap)[1] == 'w'))
62: *ap = "-l";
63: if (++ap == av + ENTRIES)
64: break;
65: lp = NULL;
66: }
67:
68: if (pipe(p) < 0)
69: fatal("pipe");
70:
71: switch(fork()) {
72: case 0:
73: (void)close(p[0]);
74: if (p[1] != 1) {
75: (void)dup2(p[1], 1);
76: (void)close(p[1]);
77: }
78: execv(_PATH_FINGER, av);
79: _exit(1);
80: case -1:
81: fatal("fork");
82: }
83: (void)close(p[1]);
84: if (!(fp = fdopen(p[0], "r")))
85: fatal("fdopen");
86: while ((ch = getc(fp)) != EOF) {
87: if (ch == '\n')
88: putchar('\r');
89: putchar(ch);
90: }
91: exit(0);
92: }
93:
94: fatal(msg)
95: char *msg;
96: {
97: extern int errno;
98: char *strerror();
99:
100: fprintf(stderr, "fingerd: %s: %s\r\n", msg, strerror(errno));
101: exit(1);
102: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.