summaryrefslogtreecommitdiff
path: root/ncr.c
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>1997-04-08 00:29:19 +0000
committer <>2013-02-25 15:20:59 +0000
commitf8d9d05cfb1ea783457a14d3cf7fdf4d8fa450f2 (patch)
tree058251f5aa8af2365812daa56d936e91720a6027 /ncr.c
downloadtcp-wrappers-f8d9d05cfb1ea783457a14d3cf7fdf4d8fa450f2.tar.gz
Imported from /home/lorry/working-area/delta_tcp-wrappers/tcp_wrappers_7.6.tar.gz.HEADtcp_wrappers_7.6master
Diffstat (limited to 'ncr.c')
-rw-r--r--ncr.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/ncr.c b/ncr.c
new file mode 100644
index 0000000..b903fb8
--- /dev/null
+++ b/ncr.c
@@ -0,0 +1,81 @@
+ /*
+ * This part for NCR UNIX with is from Andrew Maffei (arm@aqua.whoi.edu). It
+ * assumes TLI throughout. In order to look up endpoint address information
+ * we must talk to the "timod" streams module. For some reason "timod" wants
+ * to sit directly on top of the device driver. Therefore we pop off all
+ * streams modules except the driver, install the "timod" module so that we
+ * can figure out network addresses, and then restore the original state.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#) ncr.c 1.1 94/12/28 17:42:34";
+#endif
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <syslog.h>
+#include <sys/tiuser.h>
+#include <stropts.h>
+#include <sys/conf.h>
+
+#include "tcpd.h"
+
+#define MAX_MODULE_COUNT 10 /* XXX */
+
+/* fromhost - tear down the streams stack then rebuild it */
+
+void fromhost(request)
+struct request_info *request;
+{
+ int i;
+ int num_mod;
+ struct str_list str_list;
+ struct str_mlist mod_buffer[MAX_MODULE_COUNT];
+ int fd = request->fd;
+
+ str_list.sl_nmods = MAX_MODULE_COUNT;
+ str_list.sl_modlist = &mod_buffer[0];
+
+ /*
+ * On systems with WIN streams support we have to be careful about what
+ * is on the stream we are passed. This code POPs off all modules above
+ * the pseudo driver, pushes timod, gets the host address information,
+ * pops timod and then pushes all modules back on the stream.
+ *
+ * Some state may be lost in this process. /usr/etc/tlid seems to do special
+ * things to the stream depending on the TCP port being serviced. (not a
+ * very nice thing to do!). It is unclear what to do if this code breaks
+ * - the stream may be left in an unknown condition.
+ */
+ if ((num_mod = ioctl(fd, I_LIST, NULL)) < 0)
+ tcpd_warn("fromhost: LIST failed: %m");
+ if (ioctl(fd, I_LIST, &str_list) < 0)
+ tcpd_warn("fromhost: LIST failed: %m");
+
+ /*
+ * POP stream modules except for the driver.
+ */
+ for (i = 0; i < num_mod - 1; i++)
+ if (ioctl(fd, I_POP, 0) < 0)
+ tcpd_warn("fromhost: POP %s: %m", mod_buffer[i].l_name);
+
+ /*
+ * PUSH timod so that host address ioctls can be executed.
+ */
+ if (ioctl(fd, I_PUSH, "timod") < 0)
+ tcpd_warn("fromhost: PUSH timod: %m");
+ tli_host(request);
+
+ /*
+ * POP timod, we're done with it now.
+ */
+ if (ioctl(fd, I_POP, 0) < 0)
+ tcpd_warn("fromhost: POP timod: %m");
+
+ /*
+ * Restore stream modules.
+ */
+ for (i = num_mod - 2; i >= 0; i--)
+ if (ioctl(fd, I_PUSH, mod_buffer[i].l_name) < 0)
+ tcpd_warn("fromhost: PUSH %s: %m", mod_buffer[i].l_name);
+}