Relay-Version: version B 2.10.3 4.3bsd-beta 6/6/85; site seismo.CSS.GOV Posting-Version: version B 2.10.2 9/3/84; site panda.UUCP Path: seismo!harvard!talcott!panda!sources-request From: sources-request@panda.UUCP Newsgroups: mod.sources Subject: Updates to GaTech Sendmail files Message-ID: <1037@panda.UUCP> Date: 28 Oct 85 03:11:52 GMT Sender: jpn@panda.UUCP Lines: 1179 Keywords: release 3 Approved: jpn@panda.UUCP Mod.sources: Volume 3, Issue 28 Submitted by: Gene Spafford Nothing like a formal release to expose bugs.... This package contains some enhancements, corrections, and more explanation of the things the GT sendmail configuration does. A few of the changed files are included in their entirety, but most of the files here are simply "diff" files which can be applied to the Release 2 files by "patch" or by hand. If you missed the posting of Release 2 to mod.sources, you can contact me directly for copies of Release 3, which is Release 2 with these changes in place. [ or you can contact me, moderator for mod.sources and I will send you the original distribution. - send all requests to sources-request@panda - John P. Nelson (decvax!genrad!panda!jpn seismo!harvard!talcott!panda!jpn) ] As usual, please direct bug fixes and comments to me. ---- Gene Spafford The Clouds Project, School of ICS, Georgia Tech, Atlanta GA 30332 CSNet: Spaf @ GATech ARPA: Spaf%GATech.CSNet @ CSNet-Relay.ARPA uucp: ...!{akgua,decvax,hplabs,ihnp4,linus,seismo,ulysses}!gatech!spaf : to unbundle, "sh" this file -- DO NOT use csh : SHAR archive format. Archive created Sun Oct 27 18:12:58 EST 1985 echo x - Changes sed 's/^X//' > Changes <<'+FUNKY+STUFF+' XThese are the changes between release 2 and release 3: X XMakefile -- minor changes to reflect addition of new patch files XPATCHES -- added some comments, changed TCP references to SMTP, X removed "-p" flag additions (see comments in the file). X *Whole* file included. XPATCHES2 -- new patches for sendmail -- see comments in file. X *Whole* file included. XPATCH3 -- new patches for sendmail to implement -oM option. See X comments in the file itself. *Whole* file included. XREADME -- brought comments and references up-to-date. Corrected X a number of errors. *Whole* file included. Xbase.m4 -- expanded the headers somewhat to take advantage of -oM flags. X Fixed a couple of small bugs. Added handling of special X a.DOMAIN!person type addresses (read new section in X overview.ms about this). Xcirrus.mc, gitpyr.mc, nimbus.mc, stratus.mc -- Added some aliases. Xgatech.mc -- a few bug fixes for UUCP mail. Added recognition of X a.DOMAIN!person style addresses (see overview.ms). Changed X named of DEC gateway to decwrl.dec.com. Xgtbase.m4 -- Added UK as a top-level domain, bug fixes. Xoverview.ms -- Corrections and added info on new addressing features. X *Whole* file included. Xuumail.m4 -- corrected a faulty comment field Xversion.m4 -- updated to identify this version. +FUNKY+STUFF+ echo '-rw-r----- 1 spaf 1269 Oct 27 18:09 Changes (as sent)' chmod u=rw,g=r,o= Changes ls -l Changes echo x - README sed 's/^X//' > README <<'+FUNKY+STUFF+' XThe files in this package build the sendmail.cf files for machines at XGeorgia Tech. They are derived from the standard BSD 4.2 sendmail Xfiles, and form a set of sendmail files we received along with PMDF Xfrom the folks at CSNet. The CSNet set of files were put together by XRay Essick (essick@a.cs.uiuc.edu) and were a great help in putting this Xpackage together. Many of the individual rules were derived from Xvarious sources posted to the Usenet net.mail and net.sources Xnewsgroups. Credit is also due Rick Adams at seismo.css.gov for his Xcontinued comments and help in debugging some of headers, and to XStuart Stirling at emory.CSNET for help with some of the initial Xdebugging. X XContained in this package are the following: X1) MANIFEST which lists each file in the package, along with a X one line description of what it does; X2) KEY which describes macros used in the sendmail files; X3) source and Makefiles for building our various sendmail.cf files; X4) overview.ms, a paper describing how mail gets routed when X mailed to or through gatech (nroff -ms overview.ms | more); X5) uumail.c, the source to our rerouting mailer ("pathalias", which X is used to build the mailer database, has been posted multiple times X to the net and is not included). See the comments at the beginning X of the program before your try to install it; X6) PATCHES, PATCHES2 & PATCH3, which are a set of changes to the X sendmail code, needed to be implemented to make some of these X sendmail rules work optimally. Make sure to read about the corresponding X change to "rmail" described in the comments. X7) Files, which is a brief list of the data files which are present to X drive the sendmail on "gatech". X XThe remainder of this file is an overview of the environment in which Xthese files were developed and are used. X XThe machines using "sendmail" at Georgia Tech fall into 3 basic Xcategories: gateway ("gatech"), department machines on a common Xethernet ("stratus", "nimbus", et.al.), and campus machines not on the Xsame Ethernet as "gatech" (only "gt-cmmsr" so far). We have at least Xone Ethernet loop on campus which is separate from the ICS loop X("gtss", "gtqo", et. al.). X X"gatech" is intended to be the campus gateway machine. It is on the XICS common ethernet, has over 50 major uucp contacts known to the Xoutside world, has a CSNet connection, a number of direct asynchronous Xlinks, and a set of rotored phone lines. Sometime in the Xnot-too-distant future, it is possible that "gatech" will also be on Xthe Arpanet and/or Bitnet. It is also the "traditional" mail address Xknown to most outsiders. Thus, the machine is on 3 distinct networks, Xand has to be configured with the possibility of connecting to at least X1 other major international network in the near future. X XThe department machines currently are comprised of the Clouds research Xmachines "gt-stratus", "gt-cirrus", and "gt-nimbus", and the ICS/OCS XPyramid "gitpyr". They are connected via a common ethernet link, and Xthey all can speak TCP at each other. Other machines are expected to Xbe added to this group before long. Almost all of these machines have Xa single phone line and/or direct links for uucp to machines that can't Xspeak TCP. (We are trying to keep a consistant naming scheme in use, Xand thus all campus machines will henceforth be named with the prefix X"gt-" in the name. There are a few machines around which had Xestablished UUCP networks connections with different names before the Xdecision to use this standard came into being, and their names will Xprobably not change (e.g., "gitpyr") but we have "gt-" aliases for those Xmachines (e.g., "gt-pyr").) X X XThe third class of machine on campus runs sendmail but has no TCP Xconnection to the others because our Net/One bridge won't pass TCP Xpackets across the backbone. These sites use a phone line or Net/One Xvirtual circuit to connect to "gatech" and some of the other systems. XSome of these machines may talk to each other via Ethernet, but Xthere is no common connection amongst all of them. X XThe basic idea in our configuration is for users to be able to use Xaddresses of the forms: X site!user, site!site2!user, user@site.UUCP X user@site.CSNET, user@site.ARPA, user@site.MAILNET, X user@site.BITNET, user@site.DEC, site.DOMAIN!user Xand the local case: user@site.GTNET, site:user, user%site XWe'd also like to be able to use just "user@site" and let the mailer Xfigure it out. Here's how my sendmail files accomplish that: X XAll of the internal machines are simple: they merely canonicalize the Xaddress according to standard rule, look to see if it is a GTNET host Xthat they know and send the letter straight to that host. Local letters Xare handled appropriately. Any other address which looks like a network Xaddress is sent to the relay site, "gatech", except that each machine Xcan have a small number of direct UUCP connections to outside Xmachines. Ruleset zero for these systems check for these UUCP Xconnections. Note that we use a file (/usr/lib/mail/uucp.local) to Xhold the UUCP connection list so that we don't have to play around with Xthe actual sendmail configuration if we change contacts. The only Xthing one has to do to update the list of UUCP connections available on Xthat host is update the file. If you run with a frozen sendmail.cf, you Xalso have to type "/usr/lib/sendmail -bz". X XThe "gatech" machine is the complex one. Any address that the internal Xmachines are unable to handle gets bounced to this machine. The X"gatech" machine speaks to a plethora of people. "gatech" should be Xable to recognize and route any (valid) address. The "gatech" machine Xcompares UUCP addresses against a file similar to the way the other Xmachines handle them. Mail to the CSNET domain is sent to the PMDF Xmailer, which queues the letter for phone transmission to the XCSnet-relay host. Mail to the ARPA domain, since we have no direct XARPA connection (yet), is handed to the PMDF mailer for transmission to the XCSnet-relay, which is an ARPA host. Mail to the BITNET (IBM Xderivative) and MAILNET (through MIT-multics) machines are routed to Xthe host defined by the $B and $M macros. Mail to the DEC E-net is Xrouted to the site listed in the $E macro, currently "decwrl.dec.com". XMail to the OZ network (Australia) is routed to munnari.uucp ($Z). XSince we do not have connections to any of those networks, we instead Xappend the address of a known gateway to the address forming something Xlike: user@host.mailnet@mit-multics.arpa and then re-iterate through Xruleset 0 to get from our machine to the gateway. X XAny address without a domain gets converted into an address of the form X"user@site", and it makes an attempt to intuit the domain. This is done Xby checking (in order) the list of local sites, local uucp contacts (1 Xhop), CSNET, ARPA, BITNET, UUCP, and DEC E-net sites. In the event of a Xmatch, the proper domain name is appended to the address and we Xre-iterate through ruleset zero. This catches a fair number of missing Xdomain problems and hasn't caused too much confusion about names in use Xin several domains. X XFinally, the "gatech" machine takes any left-over non-local names and Xreturns them to the sender with a message about the fact that there is Xan unknown host/domain name in his letter. X XThe UUCP mailer on "gatech" is a re-routing mailer. Any path or Xaddress handed to "uumail" gets an "optimal" path supplied to it. That Xis, the program steps through the address from ultimate destination to Xbeginning, and if it knows a path to that site it will substitute that Xpath for the remainder of the user-supplied path. For example, if the Xaddress "a!b!c!d!e!f" is provided to the mailer, and it knows how to Xget to site "d" via "z!y" (but no idea how to get to "e"), it will Xrewrite the path to be "z!y!d!e!f". The path database is built using X"pathalias" on the uucp map data obtained from the Usenix machine X("gatech" is a regional repository of UUCP map information and gets Xnear-synchronous copies of map updates). X XThe ruleset along with "uumail" rewrites the "To:" field to look like X"f@e.UUCP" since the user-supplied address-path is probably not the Xpath that the mailer is going to use. Note that this means that X"uumail.m4" and "uucpm.m4" are NOT identical in function -- beware if Xyou decide to use one of them as a base in building your own files. X"uucpm.m4" does not muck about with the "To:" field, nor does it Xreroute mail. X XThis uucp mechanism allows any of our users to simply address mail to X"foo@site.UUCP" and not worry about a path. It also optimizes message Xpaths provided when answering news articles, and it allows our Xneighbors without mail routing software to address mail to X"gatech!somesite!person" and expect the mail to get through, if Xpossible. So far, no one has complained about not being able to force Xa particular path through our mailer. In the 8+ months this mechanism Xhas been working, I've only discovered about 10 sites not registered Xwith the map project and thus ccausing mail to them to fail. X XThat's about it. If you find these useful in some way, great. If you Xshould find bugs or possible enhancements to these files, I would Xgreatly appreciate hearing about it. X---- XGene Spafford XThe Clouds Project, School of ICS, Georgia Tech, Atlanta GA 30332 XCSNet: Spaf @ GATech ARPA: Spaf%GATech.CSNet @ CSNet-Relay.ARPA Xuucp: ...!{akgua,allegra,hplabs,ihnp4,linus,seismo,ulysses}!gatech!spaf +FUNKY+STUFF+ echo '-rw-r----- 1 spaf 9410 Oct 27 17:28 README (as sent)' chmod u=rw,g=r,o= README ls -l README echo x - PATCHES sed 's/^X//' > PATCHES <<'+FUNKY+STUFF+' XFrom: topaz!hedrick 17 Sept 1985 X X[Note: These changes and comments are not the same as the ones posted Xto the net by topaz!hedrick. I have changed them so that mail received Xvia SMTP is labelled as such, rather than the orignal label of being Xreceived via SMTP (thanks to rick@seismo.css.gov for pointing this Xout). X XI also have removed the changes to add the "-p" flag and the comments Xassociated with it. The changes in file PATCH3 provided by oddjob!matt Xto use the -oMr flag instead seems to me to be more general and a Xbetter solution. In addition, it allows one to munge rmail to include Xthe sending (last relay) system via -oMs. EHS] X XHere are some patches to SENDMAIL. X 1) They allow us to handle an Arpanet host table containing names X like topaz.rutgers.edu. The original version of sendmail, X as well as sendmail.cf, assumed that all host names end in X .arpa. Changes may also be needed in UUCP and net news X if your site name does not end in .ARPA. X 2) They allow you to translate all host names to their X canonical forms, i.e. replace nicknames with the primary X name. This is now considered the correct thing to do on X the Arpanet. This adds an operator, $%, for doing the X mapping. WARNING: $% uses a single fixed location for X the translated address. Thus only one translated address X may be active at a time. This is fine for foo@bar, X but you could not normalize all of the host names in an X address like @foo,@bar:bar@gorp. In practice I don't X believe this is a problem. X 3) They allow you to make processing depend upon whether mail X arrived via UUCP or SMTP. In addition to the patches here, X you will need to modify rmail, or whatever program calls X sendmail to delivery UUCP mail. It should call sendmail X with an extra argument, -oMrUUCP. This adds an operator, X $&, for evaluating macros at runtime instead of when X sendmail.cf is loaded. $r is the name of the protocol via which X mail arrived. $r is set from the -oMr option, or by the X SMTP daemon code, which automatically sets it to the X value SMTP. The code for reading and writing queue files X saves the protocol in a line beginning with O. In case X a message gets queued, this allows us to remember which X way it arrived. X XOriginally, SENDMAIL would tack .ARPA onto your host name. This is Xa bad idea, since not all host names end in .ARPA. The assumption Xwas that your rc file said X hostname foo Xand this would turn it into foo.arpa. We now do X hostname foo.rutgers.edu Xand do not want .ARPA tacked on the end. X X*** daemon.c.ORIG Fri Feb 10 06:59:21 1984 X--- daemon.c Sat Aug 3 07:49:46 1985 X*************** X*** 183,189 X /* determine host name */ X hp = gethostbyaddr(&otherend.sin_addr, sizeof otherend.sin_addr, AF_INET); X if (hp != NULL) X! (void) sprintf(buf, "%s.ARPA", hp->h_name); X else X /* this should produce a dotted quad */ X (void) sprintf(buf, "%lx", otherend.sin_addr.s_addr); X X--- 185,191 ----- X /* determine host name */ X hp = gethostbyaddr(&otherend.sin_addr, sizeof otherend.sin_addr, AF_INET); X if (hp != NULL) X! (void) sprintf(buf, "%s", hp->h_name); X else X /* this should produce a dotted quad */ X (void) sprintf(buf, "%lx", otherend.sin_addr.s_addr); X*************** X XThe following patches add two operators: $% and $&. $% is used to Xmap host names into their canonical forms. Suppose a user sends mail Xto RED. This should be turned into the official name, RED.RUTGERS.EDU, Xin the headers. The fact that Unix does not do that causes problems Xto a number of mailers. It is a violation of the standards. $%n Xbehaves like $n, i.e. it is replaced with the nth thing on the left Xhand side. However before doing the replacement, the thing is looked Xup in /etc/hosts. If it is a host name or nickname, the official Xform of the host name is used instead. X X$& is part of a change to allow us to differentiate between UUCP and XSMTP mail. What does foo!bar@baz mean? If the mail arrived via UUCP, Xit is probably foo!. If it arrived via SMTP, it is by Xdefinition @baz. As we are a UUCP/SMTP gateway, it is Ximportant for us to get these things right. In order to do so, we Xhave done two things: X - implemented $r. This is documented as being the name of the X protocol via which the message arrived. However this was X not implemented. I implement it as follows: X - rmail calls sendmail with an option -oMrUUCP X - the sendmail daemon code sets SMTP automatically X - everything else should be local mail, and does X not set any value in this macro. X - when a queue entry is written, the protocol name X must be written out X - implemented a new operator $& to allow us to use the X value of $r in productions. You can't just use $r X on the right side of a production. It will be X evaluated when the freeze file is made. So $&r X is equivalent to $r, but is evaluated when the X rule is executed. This allows us to write rules X that differentiate. Here is the part of sendmail.cf X that uses it. It checks for foo!bar, but only if X the message arrived via UUCP. Note the use of $&r X to put the protocol name into the address, so we can X match on it. X XR$-!$* $:<$&r>$1!$2 check arriving protocol XR$-^$* $:<$&r>$1^$2 both syntaxes XR$-!$* $@$>7$2<@$1.UUCP> if via UUCP, resolve XR$-^$* $@$>7$2<@$1.UUCP> if via UUCP, resolve XR<$*>$* $2 undo kludge X X*** main.c.ORIG Fri Feb 10 11:17:52 1984 X--- main.c Mon Aug 26 04:10:51 1985 X*************** X*** 538,543 X /* at this point we are in a child: reset state */ X OpMode = MD_SMTP; X (void) newenvelope(CurEnv); X openxscript(CurEnv); X #endif DAEMON X } X X--- 541,547 ----- X /* at this point we are in a child: reset state */ X OpMode = MD_SMTP; X (void) newenvelope(CurEnv); X+ define('r',"SMTP",CurEnv); X openxscript(CurEnv); X #endif DAEMON X } X*************** X*** 701,706 X X /* and finally the conditional operations */ X '?', CONDIF, '|', CONDELSE, '.', CONDFI, X X '\0' X }; X X--- 705,716 ----- X X /* and finally the conditional operations */ X '?', CONDIF, '|', CONDELSE, '.', CONDFI, X+ X+ /* now the normalization operator */ X+ '%', NORMREPL, X+ X+ /* and run-time macro expansion */ X+ '&', MACVALUE, X X '\0' X }; X*** parseaddr.c.ORIG Fri Feb 10 06:59:12 1984 X--- parseaddr.c Mon Aug 26 04:44:15 1985 X*************** X*** 394,400 X expand("$o", buf, &buf[sizeof buf - 1], CurEnv); X (void) strcat(buf, DELIMCHARS); X } X! if (c == MATCHCLASS || c == MATCHREPL || c == MATCHNCLASS) X return (ONE); X if (c == '"') X return (QST); X X--- 394,401 ----- X expand("$o", buf, &buf[sizeof buf - 1], CurEnv); X (void) strcat(buf, DELIMCHARS); X } X! if (c == MATCHCLASS || c == MATCHREPL || c == MATCHNCLASS || X! c == MACVALUE || c == NORMREPL ) X return (ONE); X if (c == '"') X return (QST); X*************** X*** 446,451 X X # define MAXMATCH 9 /* max params per rewrite */ X X X rewrite(pvp, ruleset) X char **pvp; X X--- 447,453 ----- X X # define MAXMATCH 9 /* max params per rewrite */ X X+ char hostbuf[512]; X X X rewrite(pvp, ruleset) X*************** X*** 447,452 X # define MAXMATCH 9 /* max params per rewrite */ X X X rewrite(pvp, ruleset) X char **pvp; X int ruleset; X X--- 449,455 ----- X X char hostbuf[512]; X X+ X rewrite(pvp, ruleset) X char **pvp; X int ruleset; X*************** X*** 626,631 X /* substitute */ X for (avp = npvp; *rvp != NULL; rvp++) X { X register struct match *m; X register char **pp; X X X--- 629,635 ----- X /* substitute */ X for (avp = npvp; *rvp != NULL; rvp++) X { X+ #include X register struct match *m; X register char **pp; X char **oldavp,**tavp; X*************** X*** 628,633 X { X register struct match *m; X register char **pp; X X rp = *rvp; X if (*rp != MATCHREPL) X X--- 632,640 ----- X #include X register struct match *m; X register char **pp; X+ char **oldavp,**tavp; X+ struct hostent *hostpt; X+ extern char *macvalue(); X X rp = *rvp; X if ((*rp != MATCHREPL) && (*rp != NORMREPL)) X*************** X*** 630,636 X register char **pp; X X rp = *rvp; X! if (*rp != MATCHREPL) X { X if (avp >= &npvp[MAXATOM]) X { X X--- 637,643 ----- X extern char *macvalue(); X X rp = *rvp; X! if ((*rp != MATCHREPL) && (*rp != NORMREPL)) X { X if (avp >= &npvp[MAXATOM]) X { X*************** X*** 637,643 X syserr("rewrite: expansion too long"); X return; X } X! *avp++ = rp; X continue; X } X X X--- 644,655 ----- X syserr("rewrite: expansion too long"); X return; X } X! if (*rp == MACVALUE) { X! if (macvalue(rp[1],CurEnv)) X! *avp++ = macvalue(rp[1],CurEnv); X! } X! else X! *avp++ = rp; X continue; X } X X*************** X*** 642,647 X } X X /* substitute from LHS */ X m = &mlist[rp[1] - '1']; X # ifdef DEBUG X if (tTd(21, 15)) X X--- 654,660 ----- X } X X /* substitute from LHS */ X+ X m = &mlist[rp[1] - '1']; X # ifdef DEBUG X if (tTd(21, 15)) X*************** X*** 658,663 X } X # endif DEBUG X pp = m->first; X while (pp <= m->last) X { X if (avp >= &npvp[MAXATOM]) X X--- 671,677 ----- X } X # endif DEBUG X pp = m->first; X+ oldavp = avp; X while (pp <= m->last) X { X if (avp >= &npvp[MAXATOM]) X*************** X*** 666,671 X return; X } X *avp++ = *pp++; X } X } X *avp++ = NULL; X X--- 680,695 ----- X return; X } X *avp++ = *pp++; X+ } X+ if (*rp == NORMREPL) { X+ hostbuf[0] = '\0'; X+ for (tavp = oldavp; tavp < avp; tavp++) X+ strcat(hostbuf,*tavp); X+ hostpt = gethostbyname(hostbuf); X+ if (hostpt) { X+ *oldavp = hostpt -> h_name; X+ avp = oldavp + 1; X+ } X } X } X *avp++ = NULL; X*** queue.c.ORIG Fri Feb 10 06:59:20 1984 X--- queue.c Mon Aug 26 04:45:19 1985 X*************** X*** 105,110 X /* output creation time */ X fprintf(tfp, "T%ld\n", e->e_ctime); X X /* output name of data file */ X fprintf(tfp, "D%s\n", e->e_df); X X X--- 105,115 ----- X /* output creation time */ X fprintf(tfp, "T%ld\n", e->e_ctime); X X+ /* output protocol */ X+ if (macvalue('r',e)) { X+ fprintf(tfp, "O%s\n", macvalue('r',e)); X+ } X+ X /* output name of data file */ X fprintf(tfp, "D%s\n", e->e_df); X X*************** X*** 565,571 X /* X ** Open the file created by queueup. X */ X! X p = queuename(e, 'q'); X f = fopen(p, "r"); X if (f == NULL) X X--- 570,576 ----- X /* X ** Open the file created by queueup. X */ X! X p = queuename(e, 'q'); X f = fopen(p, "r"); X if (f == NULL) X*************** X*** 575,580 X } X FileName = p; X LineNumber = 0; X X /* X ** Read and process the file. X X--- 580,586 ----- X } X FileName = p; X LineNumber = 0; X+ define('r',NULL,e); X X /* X ** Read and process the file. X*************** X*** 595,600 X (void) chompheader(&buf[1], FALSE); X break; X X case 'M': /* message */ X e->e_message = newstr(&buf[1]); X break; X X--- 601,610 ----- X (void) chompheader(&buf[1], FALSE); X break; X X+ case 'O': X+ define('r',newstr(&buf[1]),e); X+ break; X+ X case 'M': /* message */ X e->e_message = newstr(&buf[1]); X break; X*************** X*** 628,634 X break; X } X } X- X FileName = NULL; X } X /* X X--- 638,643 ----- X break; X } X } X FileName = NULL; X } X /* X*** sendmail.h.ORIG Fri Feb 10 06:59:10 1984 X--- sendmail.h Sat Aug 3 05:06:53 1985 X*************** X*** 290,295 X # define CONDIF '\031' /* conditional if-then */ X # define CONDELSE '\032' /* conditional else */ X # define CONDFI '\033' /* conditional fi */ X /* X ** Symbol table definitions X */ X X--- 290,300 ----- X # define CONDIF '\031' /* conditional if-then */ X # define CONDELSE '\032' /* conditional else */ X # define CONDFI '\033' /* conditional fi */ X+ X+ /* normalize Internet address operator */ X+ # define NORMREPL '\034' /* normalized host replacement */ X+ # define MACVALUE '\035' /* run-time macro value */ X+ X /* X ** Symbol table definitions X */ X X +FUNKY+STUFF+ echo '-rw-r----- 1 spaf 12105 Oct 27 17:28 PATCHES (as sent)' chmod u=rw,g=r,o= PATCHES ls -l PATCHES echo x - PATCHES2 sed 's/^X//' > PATCHES2 <<'+FUNKY+STUFF+' XFrom: gatech!spaf X XThis keeps sendmail from tacking a spurious ".ARPA" onto the end of Xthe hostname when mail is received via SMTP. X X X*** daemon.c Mon Oct 14 15:10:49 1985 X--- daemon.c.orig Mon Oct 14 15:10:22 1985 X*************** X*** 183,189 X /* determine host name */ X hp = gethostbyaddr(&otherend.sin_addr, sizeof otherend.sin_addr, AF_INET); X if (hp != NULL) X! (void) sprintf(buf, "%s", hp->h_name); X else X /* this should produce a dotted quad */ X (void) sprintf(buf, "%lx", otherend.sin_addr.s_addr); X X--- 183,189 ----- X /* determine host name */ X hp = gethostbyaddr(&otherend.sin_addr, sizeof otherend.sin_addr, AF_INET); X if (hp != NULL) X! (void) sprintf(buf, "%s.ARPA", hp->h_name); X else X /* this should produce a dotted quad */ X (void) sprintf(buf, "%lx", otherend.sin_addr.s_addr); +FUNKY+STUFF+ echo '-rw-r----- 1 spaf 853 Oct 27 17:52 PATCHES2 (as sent)' chmod u=rw,g=r,o= PATCHES2 ls -l PATCHES2 echo x - PATCH3 sed 's/^X//' > PATCH3 <<'+FUNKY+STUFF+' XFrom akgua!packard!ihnp4!oddjob!matt Wed Oct 16 01:59:25 1985 X XOne thing strikes me immediately: I have rmail pass the flag X"-oMrUUCP" to sendmail, rather than inventing a new flag. XHowever, this required fixing a different sendmail bug so that XI could also give "-oMsneighbor". X X*** /tmp/readcf.c.old Tue Oct 15 18:54:21 1985 X--- /tmp/readcf.c Tue Oct 15 18:54:24 1985 X*************** X*** 633,639 X else if (tTd(37, 1)) X printf("\n"); X #endif DEBUG X! if (sticky) X setbitn(opt, StickyOpt); X X if (getruid() == 0) X X--- 637,643 ----- X else if (tTd(37, 1)) X printf("\n"); X #endif DEBUG X! if (sticky && opt != 'M') /* 'M' should never be sticky ! */ X setbitn(opt, StickyOpt); X X if (getruid() == 0) X +FUNKY+STUFF+ echo '-rw-r----- 1 spaf 722 Oct 27 17:52 PATCH3 (as sent)' chmod u=rw,g=r,o= PATCH3 ls -l PATCH3 echo x - Makefile.diff sed 's/^X//' > Makefile.diff <<'+FUNKY+STUFF+' X5c5 X< # $Header: Makefile,v 5.6 85/10/26 18:59:46 spaf Release $ X--- X> # $Header: Makefile,v 5.5 85/10/13 21:17:06 spaf Release $ X31c31 X< PATCHES2 PATCH3 uumail.c overview.ms Files X--- X> uumail.c overview.ms Files +FUNKY+STUFF+ echo '-rw-r----- 1 spaf 218 Oct 27 17:38 Makefile.diff (as sent)' chmod u=rw,g=r,o= Makefile.diff ls -l Makefile.diff echo x - overview.ms sed 's/^X//' > overview.ms <<'+FUNKY+STUFF+' X.TL XMail Handling at Gatech X.br XRevision III X.AU XGene Spafford X.AI XSchool of Information and Computer Science XGeorgia Institute of Technology X27 October 1985 X.PP XSite "gatech" is running a "smart" version of sendmail. I have Xhacked at the sendmail configuration files extensively, and although Xthey are not yet doing 100% of what I want, they seem to work pretty well Xand handle our many (sometimes unusual) mail needs. XWhat follows are brief descriptions of what happens to various bits of Xmail passing through our site. X.PP XThere have been some changes since the last time I circulated this Xdocument. Most of the changes have been inspired (?) by the changes Xto sendmail done at Rutgers which allow "sendmail" to distinguish Xthe source of incoming mail with mixed syntax addresses (e.g., a!b@c), Xand which rewrite the names of Internet hosts into the preferred form X(as given in the /etc/hosts table, derived from NIC data). X.NH 1 XWhy X.PP XSite "gatech" is directly on the uucp network X(with over 75 contacts and acting as a de facto name server for a X"southeast US domain"), the CSNet, and we serve as gateway for Xour local networks. We also have network traffic with some other Xmajor networks, and we might possibly get BITNET and ARPA access in Xthe not-too-distant future, from "gatech" or some other campus machines. XWe'd like to have as complete and robust Xa mailing environment as possible. At the same time, we'd like Xto minimize our current phone bills as they are related to UUCP mail Xtraffic. X.NH 1 XRouting X.NH 2 XKnown Domains X.PP XCurrently, there is considerable effort going on to identify and Xestablish domains for mailing. Some of these domains are already Xestablished, if only in a de facto manner. Our sendmail Xcurrently recognizes the following well-known domains: ARPA, CSNET, XGOV, EDU, COM, MIL, ORG, NET, UK, XUUCP, BITNET, DEC, and MAILNET. The following Xare also recognized when used as top-level domains: XGTNET (local to Georgia Tech), OZ (the Australian network), XTEK (recognized internal to Tektronix), and SDC (with sdcrdcf as the gateway). X.PP XThere are a number of other "domains" that are recognized when used Xin a second-level position within a uucp address. That is, we Xrecognize person@site.ATT.UUCP as something that should be Xdirected to cbosgd via uucp for further resolution. This recognition Xis done by building psuedo-sites into the uucp routing database Xbased upon the data distributed by the uucp map project. XAmong domains recognized like this are NCAL, SCAL, ATL, ATT, and Xso on; the list may change based on updates to the map. X(As an aside, at the time of this writing, "gatech" is one of Xthe regional repositories of the current map, and we get automatic Xupdates whenever the "real" map gets changed.) X.PP XIn the following descriptions, any of the above can be used in Xplace of a "DOMAIN" specifier. X.NH 2 Xuser@host[.DOMAIN] -and- user%host[.DOMAIN] X.PP XIf mail comes in addressed specifically to one of the known domains, Xit is routed as described in the next section without any further Xchanges. If the domain is not given, an attempt is made to derive Xthe domain based on available lists of host names and aliases, Xand then routed as described in the next section. If no host/domain Xmatch can be found, the mail is returned with an error stating this. X.NH 3 XDomain Derivation X.PP XHost derivation is attempted in the following order: First, the Xhost is checked to see if it is in the GTNET domain. Next, the Xhost is checked to see if it is a host one hop away via UUCP. Next, Xthe host is checked against all CSNET sites. Then it is checked Xagainst all Arpa Internet sites. Next, it is checked against the list of Xknown MAILNET hosts. Then it is checked against the list of all (other) known XUUCP sites. Then it is checked against the list of Xknown BITNET hosts. Finally, it is checked against the list Xof known DEC E-net sites. X.PP XThis kind of checking is not 100% accurate because our lists are not Xalways up-to-date. In particular, the Arpa list is updated infrequently Xdue to the fact that we aren't actually on the Arpanet, and there is no Xlist of DEC net sites available outside of DEC (we make due with Xgleaning names from posted news articles and exchanges with other sites Xinterested in compiling such a list). X.NH 3 XCollisions X.PP XIf the same hostname exists in more than one domain, the first match Xfound will be the one used. Qualification of the address with an Xexplicit domain specifier will ensure that the mail goes to the Xcorrect host (when routed through gatech). That is, the domain Xis considered to be the specifer for routing and if one is not Xexplicitly provided (or implicitly, as in the case of "!" notation), Xthen an attempt to made to guess a domain. X.NH 2 Xhost1!host2!host3...!hostn!user X.PP XStarting with "hostn" and working backwards to "host1" our mailer Xwill attempt to find a host listed in our master UUCP path database. XThis database is generated using pathalias at least weekly based on the latest Xversion of the uucp maps. If a match is found at "hostk", then the Xaddress is rewritten to be "!hostk!...hostn!user" Xand then mailed via UUCP. Such addresses are X.B never Xrouted over Xany other network, unless "hostn" is recognized to be a GTNET Xhost, in which case our internal transport mechanism is invoked, or Xunless a domain specifier is present in "host1" (see next section). X.PP XThere is X.B no Xway at present to force a path on UUCP mail through "gatech". XThis is perhaps a "not very good thing" but I can't come up with a good Xway to work in explicit paths. The map data is generally very good Xand I have observed very, very few failures since we first started Xdoing this rewriting about 6 months ago. If this presents a Xmajor problem for someone, let me know and I'll see what I can work out. X.NH 2 Xhost.DOMAIN!person X.PP XThis is a special case and mail to an address such as this is handled Xin a reasonably sane manner. That is, the mail is sent to user@host.DOMAIN Xby the proper transmission medium (probably X.B not XUUCP). This is the same syntax that gateways like X.I seismo Xand X.I ucbvax Xuse to leave the UUCP mail "domain." Thus, mail Xto ...gatech!seismo.css.gov!rick will, in fact, get to Rick Adams at Xseismo via UUCP to gatech, PMDF to CSNet-Relay, and Arpa to seismo. X.PP XFor this notational form to work, the X.B first Xcomponent of the address seen at gatech must be qualified with one of the recognized Xtop-level domains (EDU, ARPA, CSNET, BITNET, etc.). X.B No Xattempt is made to validate the hostname or the remainder of the Xaddress (the part after the first "!") since we don't know about Xsecond level domains or syntaxes in most cases (nor should be expected Xto be so aware -- that's the whole idea behind domain addressing). X.NH 2 Xhost1!host2!host3...!hostn!user@site[.DOMAIN] X.br Xhost1!host2!host3...!hostn!user%site[.DOMAIN] X.PP XThis one diverges somewhat from the standard (RFC822 et.al.). XThe way these addresses get treated is based on the way the mail Xgets into our "sendmail." If the message originates on any of the Xlocal (GTNET) machines, or if it comes in via PMDF from CSNet, then Xthe mail is routed to "site" for eventual delivery to host1!...hostn!user. XMail coming in via a UUCP link with a mixed-mode address like this will Xhave the mail routed via uucp to hostn for eventual delivery to Xuser@site. Thus, if one of our neighbors, such as someone at akgua, Xwere to send mail to us addressed as seismo!person@ucbvax.ARPA, we would Xsend the mail to seismo via uucp and present it to their "rmail" Xprogram as "rmail person@ucbvax.ARPA". X.PP XOn the other hand, should someone on gitpyr send mail addressed Xas seismo!person@ucbvax.ARPA, it would arrive at Gatech via SMTP and Xthen be sent to CSNet-relay via PMDF for delivery to site "ucbvax" with Xa request to be delivered to "seismo!person" relative to that site. XIn most cases, depending on the sites involved, Xthis kind of treatment would result in the mail failing. The sendmail Xconfigurations I have created for all the local GTNET sites are such Xthat it should not be required to specify such an address. Simply Xmailing to person@site should see the correct address and network Xtransport mechanism chosen. The Usenet "news" programs on most of these Xsites have been built to use the Internet-style of address when Xmailing replies, so there should be few cases of users even seeing mixed Xmode addresses presented to them (mail passing through any of the mailers Xgets rewritten to show a consistent format). X.NH 2 Xuser%site1%site2%site3 X.PP XAddresses of this format get turned into user%site1%site2@site3, Xand an appropriate routing is provided to "site3," if known. X.NH 2 XOther network characters X.PP XThe ":" delimiter gets turned into "!" symbols in any address Xpresented to our sendmail. XThe "^" delimiter gets turned into "!" also. Addresses of the Xform "site=user" get turned into "user@site.BITNET" by convention. X.NH 1 XErrors X.PP XI have tried to trap all possible errors and generate return mail Xwith meaningful messages. XIf you get errors you don't know how to interpret, please contact me. X.NH 1 XSource X.PP XI posted an ancestor of my current sendmail files to "mod.sources" a Xfew months ago. If these latest versions appear stable, I will post Xthem to the same place. If you'd like a copy right away, let me know. XThis includes the sendmail files for all the local GTNET machines, and Xthe source for my "uumail" program which sits between sendmail and Xuux. +FUNKY+STUFF+ echo '-rw-r----- 1 spaf 9504 Oct 27 17:28 overview.ms (as sent)' chmod u=rw,g=r,o= overview.ms ls -l overview.ms echo x - base.m4.diff sed 's/^X//' > base.m4.diff <<'+FUNKY+STUFF+' X12c12 X< # $Header: base.m4,v 5.6 85/10/26 19:54:34 spaf Release $ X--- X> # $Header: base.m4,v 5.1 85/10/13 20:45:34 spaf Release $ X39,41d38 X< # wait for aliases to be up-to-date, and create them if need be X< Oa X< OD X90d86 X< Tspaf X99c95 X< HReceived: $?sfrom $s $.by $j $?rwith $r $.($v/$V) X--- X> HReceived: $?sfrom $s $.by $j ($v/$V) X108c104 X< H?l?Received-Date: $b X--- X> # H?l?Received-Date: $b X173,176c169,171 X< R$+!$* $:<$&r>$1!$2 check arriving protocol X< R$+^$* $:<$&r>$1!$2 both syntaxes X< R$*@$-.UUCP $@$>6$1<@$2.UUCP> ...if the second time X< R$+!$* $@$>6$2<@$1.UUCP> if via UUCP, resolve X--- X> R$-!$* $:<$&r>$1!$2 check arriving protocol X> R$-^$* $:<$&r>$1!$2 both syntaxes X> R$-!$* $@$>6$2<@$1.UUCP> if via UUCP, resolve +FUNKY+STUFF+ echo '-rw-r----- 1 spaf 769 Oct 27 17:38 base.m4.diff (as sent)' chmod u=rw,g=r,o= base.m4.diff ls -l base.m4.diff echo x - cirrus.mc.diff sed 's/^X//' > cirrus.mc.diff <<'+FUNKY+STUFF+' X6c6 X< ##### $Header: cirrus.mc,v 5.2 85/10/26 18:46:40 spaf Release $ X--- X> ##### $Header: cirrus.mc,v 5.1 85/10/13 20:38:11 spaf Release $ X18c18 X< Cwgt-cirrus cirrus X--- X> Cwgt-cirrus cirrus Cirrus CIRRUS GT-Cirrus GT-CIRRUS GT-cirrus +FUNKY+STUFF+ echo '-rw-r----- 1 spaf 237 Oct 27 17:38 cirrus.mc.diff (as sent)' chmod u=rw,g=r,o= cirrus.mc.diff ls -l cirrus.mc.diff echo x - gatech.mc.diff sed 's/^X//' > gatech.mc.diff <<'+FUNKY+STUFF+' X9c9 X< ##### $Header: gatech.mc,v 5.3 85/10/27 16:07:45 spaf Release $ X--- X> ##### $Header: gatech.mc,v 5.1 85/10/13 20:38:16 spaf Release $ X21c21 X< Cwgatech ga-tech georgia-tech gt-tech gt-gatech X--- X> Cwgatech ga-tech georgia-tech X28c28 X< CUgatech gt-tech gt-gatech georgia-tech X--- X> CUgatech GATech GaTech X47c47 X< DEdecwrl.dec.com X--- X> DEdecwrl.arpa X77d76 X< R$+<@$+.$=T.UUCP> $1<@$2.$3> a.arpa.uucp -> a.arpa +FUNKY+STUFF+ echo '-rw-r----- 1 spaf 415 Oct 27 17:53 gatech.mc.diff (as sent)' chmod u=rw,g=r,o= gatech.mc.diff ls -l gatech.mc.diff echo x - gitpyr.mc.diff sed 's/^X//' > gitpyr.mc.diff <<'+FUNKY+STUFF+' X6c6 X< ##### $Header: gitpyr.mc,v 5.2 85/10/26 18:52:54 spaf Release $ X--- X> ##### $Header: gitpyr.mc,v 5.1 85/10/13 20:38:21 spaf Release $ X18c18 X< Cwgitpyr gt-gitpyr gt-pyr gt-pyramid X--- X> Cwgitpyr Gitpyr GITPYR X22c22 X< CUgitpyr gt-gitpyr gt-pyr gt-pyramid X--- X> CUgitpyr +FUNKY+STUFF+ echo '-rw-r----- 1 spaf 274 Oct 27 17:38 gitpyr.mc.diff (as sent)' chmod u=rw,g=r,o= gitpyr.mc.diff ls -l gitpyr.mc.diff echo x - gtbase.m4.diff sed 's/^X//' > gtbase.m4.diff <<'+FUNKY+STUFF+' X6c6 X< # $Header: gtbase.m4,v 5.2 85/10/26 18:53:29 spaf Release $ X--- X> # $Header: gtbase.m4,v 5.1 85/10/13 20:45:55 spaf Release $ X17c17 X< CDgtnet gatech git gt X--- X> CDgtnet GTNET GTNet GtNet GTnet X33c33 X< CTARPA UUCP BITNET CSNET MAILNET DEC EDU GOV MIL COM ORG NET OZ UK X--- X> CTARPA UUCP BITNET CSNET MAILNET DEC EDU GOV MIL COM ORG NET OZ X36c36 X< CKARPA EDU GOV MIL COM ORG NET UK X--- X> CKARPA EDU GOV MIL COM ORG NET X58c58 X< R$*<@$*$=D.$=T>$* $1<@$2LOCAL>$5 catch "gtnet.csnet" X--- X> R$*<@$*$=D.$=T>$* $1<@$2LOCAL>$4 catch "gtnet.csnet" +FUNKY+STUFF+ echo '-rw-r----- 1 spaf 550 Oct 27 17:38 gtbase.m4.diff (as sent)' chmod u=rw,g=r,o= gtbase.m4.diff ls -l gtbase.m4.diff echo x - nimbus.mc.diff sed 's/^X//' > nimbus.mc.diff <<'+FUNKY+STUFF+' X6c6 X< ##### $Header: nimbus.mc,v 5.2 85/10/26 18:46:12 spaf Release $ X--- X> ##### $Header: nimbus.mc,v 5.1 85/10/13 20:38:35 spaf Release $ X18c18 X< Cwgt-nimbus nimbus X--- X> Cwgt-nimbus nimbus NIMBUS Nimbus GT-Nimbus GT-nimbus GT-NIMBUS +FUNKY+STUFF+ echo '-rw-r----- 1 spaf 237 Oct 27 17:38 nimbus.mc.diff (as sent)' chmod u=rw,g=r,o= nimbus.mc.diff ls -l nimbus.mc.diff echo x - stratus.mc.diff sed 's/^X//' > stratus.mc.diff <<'+FUNKY+STUFF+' X6c6 X< ##### $Header: stratus.mc,v 5.2 85/10/26 18:45:39 spaf Release $ X--- X> ##### $Header: stratus.mc,v 5.1 85/10/13 20:38:39 spaf Release $ X18c18 X< Cwgt-stratus stratus X--- X> Cwgt-stratus stratus STRATUS GT-Stratus GT-STRATUS +FUNKY+STUFF+ echo '-rw-r----- 1 spaf 229 Oct 27 17:39 stratus.mc.diff (as sent)' chmod u=rw,g=r,o= stratus.mc.diff ls -l stratus.mc.diff echo x - uumail.m4.diff sed 's/^X//' > uumail.m4.diff <<'+FUNKY+STUFF+' X7c7 X< ##### $Header: uumail.m4,v 5.2 85/10/26 18:40:33 spaf Release $ X--- X> ##### $Header: uumail.m4,v 5.1 85/10/13 20:46:17 spaf Release $ X34c34 X< R$+<@$-.LOCAL> $2!$1 u@h.LOCAL => h!u X--- X> R$+<@$-.LOCAL> $2!$1 u@h.LOCAL => u%h +FUNKY+STUFF+ echo '-rw-r----- 1 spaf 242 Oct 27 17:39 uumail.m4.diff (as sent)' chmod u=rw,g=r,o= uumail.m4.diff ls -l uumail.m4.diff echo x - version.m4.diff sed 's/^X//' > version.m4.diff <<'+FUNKY+STUFF+' X1c1 X< # $Header: version.m4,v 5.3 85/10/26 18:39:43 spaf Release $ X--- X> # $Header: version.m4,v 5.1 85/10/13 20:46:20 spaf Release $ X3c3 X< DV6.0.GT X--- X> DV5.8.GaTech +FUNKY+STUFF+ echo '-rw-r----- 1 spaf 168 Oct 27 17:39 version.m4.diff (as sent)' chmod u=rw,g=r,o= version.m4.diff ls -l version.m4.diff exit 0