Updates to GaTech Sendmail files

sources-request at panda.UUCP sources-request at panda.UUCP
Mon Oct 28 13:11:52 AEST 1985


Mod.sources:  Volume 3, Issue 28
Submitted by: Gene Spafford <gatech!spaf>


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 at 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 at 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 at site.UUCP
X		user at site.CSNET, user at site.ARPA, user at site.MAILNET,
X		user at site.BITNET, user at site.DEC, site.DOMAIN!user
Xand the local case:     user at site.GTNET, site:user, user%site
XWe'd also like to be able to use just "user at 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 at 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 at 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 at 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 at 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 at 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 at bar,
X	but you could not normalize all of the host names in an
X	address like @foo, at bar:bar at 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 at baz mean?  If the mail arrived via UUCP,
Xit is probably foo!<bar at baz>.  If it arrived via SMTP, it is by
Xdefinition <foo!bar>@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<UUCP>$-!$*		$@$>7$2<@$1.UUCP>		if via UUCP, resolve
XR<UUCP>$-^$*		$@$>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 <netdb.h>
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 <netdb.h>
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 at 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 at 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 at 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 "<path to hostk>!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 at 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 at 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 at site.  Thus, if one of our neighbors, such as someone at akgua,
Xwere to send mail to us addressed as seismo!person at ucbvax.ARPA, we would
Xsend the mail to seismo via uucp and present it to their "rmail"
Xprogram as "rmail person at ucbvax.ARPA".
X.PP
XOn the other hand, should someone on gitpyr send mail addressed
Xas seismo!person at 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 at 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 at 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 at 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>$*@$-.UUCP	$@$>6$1<@$2.UUCP>		...if the second time
X< R<UUCP>$+!$*		$@$>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<UUCP>$-!$*		$@$>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 at h.LOCAL => h!u
X---
X> R$+<@$-.LOCAL>		$2!$1				u at 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



More information about the Mod.sources mailing list