From zmailer-owner@nic.funet.fi Mon Dec 15 23:42:56 1997
Received: from fwns1d.raleigh.ibm.com ([204.146.167.235]:7433 "EHLO fwns1.raleigh.ibm.com" ident: "NO-IDENT-SERVICE") by nic.funet.fi with ESMTP id <14237-6240>; Mon, 15 Dec 1997 23:35:02 +0200
Received: from rtpmail03.raleigh.ibm.com (rtpmail03.raleigh.ibm.com [9.37.172.47]) by fwns1.raleigh.ibm.com (AIX4.2/UCB 8.7/8.7RTP-FW1.1) with ESMTP id QAA04806 for <zmailer@nic.funet.fi>; Mon, 15 Dec 1997 16:34:51 -0500 (EST)
From: pakrat@raleigh.ibm.com
Received: from pakrat.raleigh.ibm.com (pakrat.raleigh.ibm.com [9.67.161.212])
by rtpmail03.raleigh.ibm.com (8.8.5/8.8.5/RTP-ral-1.1) with ESMTP id QAA27272
for <zmailer@nic.funet.fi>; Mon, 15 Dec 1997 16:34:54 -0500
Received: from pakrat@localhost by pakrat.pakrat.raleigh.ibm.com id <1098-33974>; Mon, 15 Dec 1997 16:04:31 -0500
Subject: Oddball routing begats longestname and iproutes. Here are the patches
To: zmailer@nic.funet.fi
Date: Mon, 15 Dec 1997 16:04:31 -0500 (EST)
X-Mailer: ELM [version 2.4 PL20]
MIME-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Message-Id: <19971215213440Z1098-33974+1@pakrat.pakrat.raleigh.ibm.com>
Return-Path: <zmailer-owner@nic.funet.fi>
X-Orcpt: rfc822;mea
Status: RO
Here are my patches to
* get the longestname driver into the router/db.c subsystem
* fix newaliases and newdb to support bhash
* through the longestname driver, support routing based on IP.
I will graciously accept tips on cleaning up the code and getting
a little more speed out of it.
One note, since I created the patch I felt that the following replacement
p-iproutes.cf was needed for reasons of SPEED.
# a=$(lookup_list mx_records $domain);
# a=$(lookup_list cname_records $a);
# a=$(lookup_list a_records $a);
a=$(first $(mx_records $domain || echo $domain))
a=$(first $(cname_records $a || echo $a))
a=$(first $(a_records $a || echo $a))
Enjoy
Chris Dukes
Only in zmailer-2.99.49p9/doc/guides: smtp-policy~
diff -ur zmailer-2.99.49p9/proto/cf/i-iproutes.cf zmailer-2.99.49p9-b2/proto/cf/i-iproutes.cf
--- zmailer-2.99.49p9/proto/cf/i-iproutes.cf Mon Dec 15 11:06:08 1997
+++ zmailer-2.99.49p9-b2/proto/cf/i-iproutes.cf Mon Dec 15 11:05:34 1997
@@ -0,0 +1,56 @@
+# Routes override initializations
+#
+# Relations: iproutesdb
+
+provide iproutesdb
+
+if [ -f $MAILVAR/db/iproutes ]; then
+ if [ -f $MAILVAR/db/iproutes.zmsh ]; then
+ # With zmailer utility: make-incore.sh
+ # you can create a static routing database (of reasonable size!)
+ # which is loaded incore of the routing processes.
+ if [ $MAILVAR/db/iproutes -nt $MAILVAR/db/iproutes.zmsh ]; then
+ local cmd
+ cmd="$MAILBIN/make-incore.sh"
+ "$cmd" iproutesdb "$MAILVAR/db/iproutes" "$MAILVAR/db/iproutes.zmsh"
+ fi
+ . $MAILVAR/db/iproutes.zmsh
+ elif [ -f $MAILVAR/db/iproutes$DBEXTtest ]; then
+ if [ $MAILVAR/db/iproutes -nt $MAILVAR/db/iproutes$DBEXTtest ]; then
+ $MAILBIN/newdb $MAILVAR/db/iproutes
+ fi
+ relation -lmt $DBTYPE -f $MAILVAR/db/iproutes$DBEXT -d longestmatch iproutesdb
+ else
+ relation -lmt unordered -f $MAILVAR/db/iproutes -d longestmatch iproutesdb
+ fi
+else
+ iproutesdb () { return 1 }
+fi
+
+#| The "iproutes" database is the file $MAILVAR/db/iproutes.
+#| It contains routing exceptions for hosts or domains that would
+#| otherwise be routed by the normal database lookups for a particular
+#| network or protocol. The value is expected to be in the following
+#| form:
+
+#| channel "!" host [ { "!" host } ]
+
+#| The channel is a well-known channel from the set: local, error, ignore,
+#| smtp, uucp, ean, usenet, bsmtp3, bitnet2, bitnet2truncate, defrt1, and
+#| defrt1truncate. The exact set depends on which protocols are
+#| supported by the loaded configuration.
+
+#| For example, the line:
+
+#| .domain uucp!host1!host2
+
+#| would send all mail for domain or its subdomains to host1 via UUCP,
+#| with a request to remail to host2!address. This is pathalias output
+#| semantics.
+
+#| The line
+
+#| host smtp![192.12.180.4]
+
+#| would send all mail for host to the SMTP server on the host at IP
+#| address 192.12.180.4.
diff -ur zmailer-2.99.49p9/proto/cf/p-iproutes.cf zmailer-2.99.49p9-b2/proto/cf/p-iproutes.cf
--- zmailer-2.99.49p9/proto/cf/p-iproutes.cf Mon Dec 15 11:06:12 1997
+++ zmailer-2.99.49p9-b2/proto/cf/p-iproutes.cf Mon Dec 15 12:26:45 1997
@@ -0,0 +1,51 @@
+# Routes override
+#
+# This is the simple interface to the db/iproutes file. The function that
+# interprets the value returned is routes_spec, provided there because it
+# is of general use.
+
+require iproutesdb crossbar
+provide iproutes
+
+relation -t bind,mx mx_records
+relation -t bind,cname cname_records
+relation -t bind,a a_records
+
+
+lookup_list (lu_type, list) {
+ local tmp res scr
+ res=""
+ for tmp in $(elements $list); do
+ for scr in $(elements $($lu_type $tmp ||$(list $tmp))); do
+ res="$res $scr"
+ done
+ done
+ return $(list $res)
+}
+
+
+iproutes_neighbour (domain, address, A) {
+ local tmp a b
+
+ a=$(lookup_list mx_records $domain);
+ a=$(lookup_list cname_records $a);
+ a=$(lookup_list a_records $a);
+
+ for b in $(elements $a); do
+# We look for the deprecated channel! route. If we find it, toss it through.
+# elsewise take the last one we found.
+ tmp=$(iproutesdb "$b") &&
+ sift "$tmp" in
+ .*! tmp=$(routes_spec "$tmp" "$address" $A) &&
+ return $tmp ;;
+ tfis
+ done
+ tmp=$(routes_spec "$tmp" "$address" $A) &&
+ return $tmp
+
+#| The routes_spec function interprets the return value from the
+#| iproutesdb lookup.
+
+ return 1
+}
+
diff -ur zmailer-2.99.49p9/proto/newaliases.in zmailer-2.99.49p9-b2/proto/newaliases.in
--- zmailer-2.99.49p9/proto/newaliases.in Thu Oct 16 09:21:19 1997
+++ zmailer-2.99.49p9-b2/proto/newaliases.in Mon Dec 15 11:02:51 1997
@@ -56,6 +56,9 @@
# Now install the files
case "$DBTYPE" in
+bhash)
+ mv $ALIASFILE.$$ $ALIASFILE.dbh
+ ;;
btree)
mv $ALIASFILE.$$.db $ALIASFILE.db
;;
Only in zmailer-2.99.49p9-b2/proto: newaliases.in.orig
diff -ur zmailer-2.99.49p9/proto/newdb.in zmailer-2.99.49p9-b2/proto/newdb.in
--- zmailer-2.99.49p9/proto/newdb.in Thu Oct 16 09:21:28 1997
+++ zmailer-2.99.49p9-b2/proto/newdb.in Mon Dec 15 11:01:49 1997
@@ -34,6 +34,9 @@
# Now install the files
case "$DBTYPE" in
+bhash)
+ mv $BASENAME.$$ $BASENAME.dbh
+ ;;
btree)
mv $BASENAME.$$.db $BASENAME.db
;;
Only in zmailer-2.99.49p9-b2/proto: newdb.in.orig
diff -ur zmailer-2.99.49p9/router/db.c zmailer-2.99.49p9-b2/router/db.c
--- zmailer-2.99.49p9/router/db.c Fri Oct 24 19:26:17 1997
+++ zmailer-2.99.49p9-b2/router/db.c Mon Dec 15 11:04:28 1997
@@ -1,6 +1,8 @@
/*
* Copyright 1988 by Rayan S. Zachariassen, all rights reserved.
* This will be free software, but only when it is finished.
+ *
+ * 'longestmatch' driver kissg@sztaki.hu 970209
*/
/*
@@ -150,6 +152,7 @@
/* drivers */
static conscell *find_domain __((conscell *DBFUNC(lookupfn), search_info *sip));
static conscell *find_nodot_domain __((conscell *DBFUNC(lookupfn), search_info *sip));
+static conscell *find_longest_match __((conscell *DBFUNC(lookupfn), search_info *sip));
/* others.. */
static void cacheflush __((struct db_info *dbip));
extern conscell *readchunk __((const char *file, long offset));
@@ -194,6 +197,8 @@
proto_config.driver = find_nodot_domain;
else if (strcmp(optarg, "pathalias") == 0)
proto_config.driver = find_domain;
+ else if (strcmp(optarg, "longestmatch") == 0)
+ proto_config.driver = find_longest_match;
else
++errflg;
break;
@@ -952,6 +957,86 @@
if (dbkp->config.lookup == dbip->lookup)
return dbkp->name;
}
+ return NULL;
+}
+
+/*
+ * Searching the longest match.
+ *
+ * The lookup sequence for foo.bar.edu is:
+ *
+ * foo.bar.edu
+ * .bar.edu
+ * .edu
+ * .
+ *
+ * The lookup sequence for 1.2.3.13 is:
+ *
+ * 1.2.3.13/32
+ * 1.2.3.12/31
+ * 1.2.3.12/30
+ * 1.2.3.8/29
+ * 1.2.3.0/28
+ * ...
+ * 1.0.0.0/8
+ * ...
+ * 0.0.0.0/1
+ * 0.0.0.0/0
+ */
+
+static conscell *
+find_longest_match(lookupfn, sip)
+ conscell *DBFUNC(lookupfn);
+ search_info *sip;
+{
+ register char *cp;
+ conscell *l;
+ char buf[BUFSIZ];
+ char *realkey;
+ unsigned int oct1,oct2,oct3,oct4;
+
+ if (sscanf((char*)(sip->key[0]=='[' ? sip->key+1 : sip->key),
+ "%3u.%3u.%3u.%3u",
+ &oct1,&oct2,&oct3,&oct4) == 4) { /* IP address with optional [] */
+ unsigned int h_addr,h_mask;
+ int prefix;
+ h_addr=(((oct1&255)<<8|oct2&255)<<8|oct3&255)<<8|oct4&255;
+ sip->key=buf;
+ for (prefix=32, h_mask=0xffffffffL;
+ prefix>=0; --prefix, h_mask<<=1) {
+ sprintf((char*)buf,"%u.%u.%u.%u/%d",
+ (h_addr&h_mask) >> 24 & 255,
+ (h_addr&h_mask) >> 16 & 255,
+ (h_addr&h_mask) >> 8 & 255,
+ (h_addr&h_mask) & 255,
+ prefix);
+ if ((l = (*lookupfn)(sip)) != NULL)
+ return l;
+ }
+ }
+ else { /* domain name */
+ /* check the key as given */
+ if ((l = (*lookupfn)(sip)) != NULL)
+ return l;
+ realkey = (char *) sip->key;
+ /* iterate over the superdomains of the key */
+ for (cp = realkey; *cp;) {
+ while (*cp && *cp != '.')
+ ++cp;
+ while (*cp == '.')
+ ++cp;
+ if (*(cp-1) == '.') {
+ sip->key = cp-1;
+ if ((l = (*lookupfn)(sip)) != NULL)
+ return l;
+ }
+ }
+ /* Still failed ? Try to look for "." */
+ sip->key = ".";
+ if ((l = (*lookupfn)(sip)) != NULL)
+ return l;
+ }
+
return NULL;
}
Only in zmailer-2.99.49p9-b2/router: db.c.orig
diff -ur zmailer-2.99.49p9/utils/socks4conf_2_iproutes.pl zmailer-2.99.49p9-b2/utils/socks4conf_2_iproutes.pl
--- zmailer-2.99.49p9/utils/socks4conf_2_iproutes.pl Mon Dec 15 13:01:00 1997
+++ zmailer-2.99.49p9-b2/utils/socks4conf_2_iproutes.pl Mon Dec 15 13:03:01 1997
@@ -0,0 +1,22 @@
+#!/usr/bin/perl -awnl
+BEGIN {
+ my($i,$j,$num,@octets);
+ for($i=32,$j=0;$i>=0;$i--,$j++) {
+ $num=((-1)<<$j);
+ @octets=unpack("C4",pack("L",$num));
+ $convert{join(".",@octets)}=$i;
+ }
+}
+/^direct/ && do {$offset=0;};
+/^sockd/ && do {$offset=1;};
+(/^direct/ || /^sockd/) && do {
+ $a=pack("C4",split(/\./,$F[$offset+1]));
+ $al=unpack("L",$a);
+ $b=pack("C4",split(/\./,$F[$offset+2]));
+ $bl=unpack("L",$b);
+# print("$al $bl");
+ $c=join(".",unpack("C4",pack("L",$al&$bl)));
+ $d=$convert{$F[$offset+2]};
+ print("$c/$d smtp!");
+}
+
syntax highlighted by Code2HTML, v. 0.9.1