1: /*
2: * This part for NCR UNIX with is from Andrew Maffei (arm@aqua.whoi.edu). It
3: * assumes TLI throughout. In order to look up endpoint address information
4: * we must talk to the "timod" streams module. For some reason "timod" wants
5: * to sit directly on top of the device driver. Therefore we pop off all
6: * streams modules except the driver, install the "timod" module so that we
7: * can figure out network addresses, and then restore the original state.
8: */
9:
10: #ifndef lint
11: static char sccsid[] = "@(#) ncr.c 1.1 94/12/28 17:42:34";
12: #endif
13:
14: #include <sys/types.h>
15: #include <stdio.h>
16: #include <syslog.h>
17: #include <sys/tiuser.h>
18: #include <stropts.h>
19: #include <sys/conf.h>
20:
21: #include "tcpd.h"
22:
23: #define MAX_MODULE_COUNT 10 /* XXX */
24:
25: /* fromhost - tear down the streams stack then rebuild it */
26:
27: void fromhost(request)
28: struct request_info *request;
29: {
30: int i;
31: int num_mod;
32: struct str_list str_list;
33: struct str_mlist mod_buffer[MAX_MODULE_COUNT];
34: int fd = request->fd;
35:
36: str_list.sl_nmods = MAX_MODULE_COUNT;
37: str_list.sl_modlist = &mod_buffer[0];
38:
39: /*
40: * On systems with WIN streams support we have to be careful about what
41: * is on the stream we are passed. This code POPs off all modules above
42: * the pseudo driver, pushes timod, gets the host address information,
43: * pops timod and then pushes all modules back on the stream.
44: *
45: * Some state may be lost in this process. /usr/etc/tlid seems to do special
46: * things to the stream depending on the TCP port being serviced. (not a
47: * very nice thing to do!). It is unclear what to do if this code breaks
48: * - the stream may be left in an unknown condition.
49: */
50: if ((num_mod = ioctl(fd, I_LIST, NULL)) < 0)
51: tcpd_warn("fromhost: LIST failed: %m");
52: if (ioctl(fd, I_LIST, &str_list) < 0)
53: tcpd_warn("fromhost: LIST failed: %m");
54:
55: /*
56: * POP stream modules except for the driver.
57: */
58: for (i = 0; i < num_mod - 1; i++)
59: if (ioctl(fd, I_POP, 0) < 0)
60: tcpd_warn("fromhost: POP %s: %m", mod_buffer[i].l_name);
61:
62: /*
63: * PUSH timod so that host address ioctls can be executed.
64: */
65: if (ioctl(fd, I_PUSH, "timod") < 0)
66: tcpd_warn("fromhost: PUSH timod: %m");
67: tli_host(request);
68:
69: /*
70: * POP timod, we're done with it now.
71: */
72: if (ioctl(fd, I_POP, 0) < 0)
73: tcpd_warn("fromhost: POP timod: %m");
74:
75: /*
76: * Restore stream modules.
77: */
78: for (i = num_mod - 2; i >= 0; i--)
79: if (ioctl(fd, I_PUSH, mod_buffer[i].l_name) < 0)
80: tcpd_warn("fromhost: PUSH %s: %m", mod_buffer[i].l_name);
81: }
Defined functions
Defined variables
Defined macros