GaTech Sendmail (Part 1 of 3)

sources-request at panda.UUCP sources-request at panda.UUCP
Mon Oct 14 23:20:44 AEST 1985


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


#! /bin/sh

# Make a new directory for these sources, cd to it, and run kits 1 thru 3 
# through sh.  When all 3 kits have been run, read README.

echo "This is GaTech Sendmail kit 1 (of 3).  If kit 1 is complete, the line"
echo '"'"End of kit 1 (of 3)"'" will echo at the end.'
echo ""
export PATH || (echo "You didn't use sh, you clunch." ; kill $$)
echo Extracting PATCHES
cat >PATCHES <<'!STUFFY!FUNK!'
From: topaz!hedrick  17 Sept 1985

Here are some patches to SENDMAIL.
  1) They allow us to handle an Arpanet host table containing names
	like topaz.rutgers.edu.  The original version of sendmail,
	as well as sendmail.cf, assumed that all host names end in
	.arpa.  Changes may also be needed in UUCP and net news
	if your site name does not end in .ARPA.
  2) They allow you to translate all host names to their 
	canonical forms, i.e. replace nicknames with the primary
	name.  This is now considered the correct thing to do on
	the Arpanet.  This adds an operator, $%, for doing the
	mapping. WARNING: $% uses a single fixed location for
	the translated address.  Thus only one translated address
	may be active at a time.  This is fine for foo at bar,
	but you could not normalize all of the host names in an
	address like @foo, at bar:bar at gorp.  In practice I don't
	believe this is a problem.
  3) They allow you to make processing depend upon whether mail
	arrived via UUCP or TCP.  In addition to the patches here,
	you will need to modify rmail, or whatever program calls
	sendmail to delivery UUCP mail.  It should call sendmail
	with an extra argument, -pUUCP.  This adds an operator,
	$&, for evaluating macros at runtime instead of when
	sendmail.cf is loaded.  It adds an option to sendmail,
	-p, to specify the protocol name.  It implements $r,
	which is documented in the source but never actually
	implemented.  It is the name of the protocol via which
	mail arrived.  $r is set from the -p option, or by the
	SMTP daemon code, which automatically sets it to the
	value TCP.  The code for reading and writing queue files
	saves the protocol in a line beginning with O.  In case
	a message gets queued, this allows us to remember which
	way it arrived.

Originally, SENDMAIL would tack .ARPA onto your host name.  This is
a bad idea, since not all host names end in .ARPA.  The assumption
was that your rc file said
   hostname foo
and this would turn it into foo.arpa.  We now do
   hostname foo.rutgers.edu
and do not want .ARPA tacked on the end.

*** daemon.c.ORIG	Fri Feb 10 06:59:21 1984
--- daemon.c	Sat Aug  3 07:49:46 1985
***************
*** 183,189
  			/* determine host name */
  			hp = gethostbyaddr(&otherend.sin_addr, sizeof otherend.sin_addr, AF_INET);
  			if (hp != NULL)
! 				(void) sprintf(buf, "%s.ARPA", hp->h_name);
  			else
  				/* this should produce a dotted quad */
  				(void) sprintf(buf, "%lx", otherend.sin_addr.s_addr);

--- 185,191 -----
  			/* determine host name */
  			hp = gethostbyaddr(&otherend.sin_addr, sizeof otherend.sin_addr, AF_INET);
  			if (hp != NULL)
! 				(void) sprintf(buf, "%s", hp->h_name);
  			else
  				/* this should produce a dotted quad */
  				(void) sprintf(buf, "%lx", otherend.sin_addr.s_addr);
***************

The following patches add two operators: $% and $&.  $% is used to
map host names into their canonical forms.  Suppose a user sends mail
to RED.  This should be turned into the official name, RED.RUTGERS.EDU,
in the headers.  The fact that Unix does not do that causes problems
to a number of mailers.  It is a violation of the standards.  $%n
behaves like $n, i.e. it is replaced with the nth thing on the left
hand side.  However before doing the replacement, the thing is looked
up in /etc/hosts.  If it is a host name or nickname, the official
form of the host name is used instead.

$& is part of a change to allow us to differentiate between UUCP and
TCP mail.  What does foo!bar at baz mean?  If the mail arrived via UUCP,
it is probably foo!<bar at baz>.  If it arrived via TCP, it is by
definition <foo!bar>@baz.  As we are a UUCP/TCP gateway, it is
important for us to get these things right.  In order to do so, we
have done two things:
  - implemented $r.  This is documented as being the name of the
	protocol via which the message arrived.  However this was
	not implemented.  I implement it as follows:
	  - rmail calls sendmail with an option -pUUCP
	  - the sendmail daemon code sets TCP automatically
	  - everything else should be local mail, and does
		not set any value in this macro.
	  - when a queue entry is written, the protocol name
		must be written out
  - implemented a new operator $& to allow us to use the
	value of $r in productions.  You can't just use $r
	on the right side of a production.  It will be
	evaluated when the freeze file is made.  So $&r
	is equivalent to $r, but is evaluated when the
	rule is executed.  This allows us to write rules
	that differentiate.  Here is the part of sendmail.cf
	that uses it.  It checks for foo!bar, but only if
	the message arrived via UUCP.  Note the use of $&r
	to put the protocol name into the address, so we can
	match on it.

R$-!$*			$:<$&r>$1!$2			check arriving protocol
R$-^$*			$:<$&r>$1^$2			both syntaxes
R<UUCP>$-!$*		$@$>7$2<@$1.UUCP>		if via UUCP, resolve
R<UUCP>$-^$*		$@$>7$2<@$1.UUCP>		if via UUCP, resolve
R<$*>$*			$2				undo kludge

*** main.c.ORIG	Fri Feb 10 11:17:52 1984
--- main.c	Mon Aug 26 04:10:51 1985
***************
*** 320,325
  			OpMode = MD_INITALIAS;
  			break;
  # endif DBM
  		}
  	}
  

--- 320,328 -----
  			OpMode = MD_INITALIAS;
  			break;
  # endif DBM
+ 		  case 'p':	/* set protocol used to receive */
+ 			define('r', &p[2], CurEnv);
+ 			break;
  		}
  	}
  
***************
*** 538,543
  		/* at this point we are in a child: reset state */
  		OpMode = MD_SMTP;
  		(void) newenvelope(CurEnv);
  		openxscript(CurEnv);
  #endif DAEMON
  	}

--- 541,547 -----
  		/* at this point we are in a child: reset state */
  		OpMode = MD_SMTP;
  		(void) newenvelope(CurEnv);
+ 		define('r',"TCP",CurEnv);
  		openxscript(CurEnv);
  #endif DAEMON
  	}
***************
*** 701,706
  
  	/* and finally the conditional operations */
  	'?', CONDIF,	'|', CONDELSE,	'.', CONDFI,
  
  	'\0'
  };

--- 705,716 -----
  
  	/* and finally the conditional operations */
  	'?', CONDIF,	'|', CONDELSE,	'.', CONDFI,
+ 
+ 	/* now the normalization operator */
+ 	'%', NORMREPL,
+ 
+ 	/* and run-time macro expansion */
+ 	'&', MACVALUE,
  
  	'\0'
  };
*** parseaddr.c.ORIG	Fri Feb 10 06:59:12 1984
--- parseaddr.c	Mon Aug 26 04:44:15 1985
***************
*** 394,400
  		expand("$o", buf, &buf[sizeof buf - 1], CurEnv);
  		(void) strcat(buf, DELIMCHARS);
  	}
! 	if (c == MATCHCLASS || c == MATCHREPL || c == MATCHNCLASS)
  		return (ONE);
  	if (c == '"')
  		return (QST);

--- 394,401 -----
  		expand("$o", buf, &buf[sizeof buf - 1], CurEnv);
  		(void) strcat(buf, DELIMCHARS);
  	}
! 	if (c == MATCHCLASS || c == MATCHREPL || c == MATCHNCLASS ||
! 	    c == MACVALUE || c == NORMREPL )
  		return (ONE);
  	if (c == '"')
  		return (QST);
***************
*** 446,451
  
  # define MAXMATCH	9	/* max params per rewrite */
  
  
  rewrite(pvp, ruleset)
  	char **pvp;

--- 447,453 -----
  
  # define MAXMATCH	9	/* max params per rewrite */
  
+ char hostbuf[512];
  
  
  rewrite(pvp, ruleset)
***************
*** 447,452
  # define MAXMATCH	9	/* max params per rewrite */
  
  
  rewrite(pvp, ruleset)
  	char **pvp;
  	int ruleset;

--- 449,455 -----
  
  char hostbuf[512];
  
+ 
  rewrite(pvp, ruleset)
  	char **pvp;
  	int ruleset;
***************
*** 626,631
  		/* substitute */
  		for (avp = npvp; *rvp != NULL; rvp++)
  		{
  			register struct match *m;
  			register char **pp;
  

--- 629,635 -----
  		/* substitute */
  		for (avp = npvp; *rvp != NULL; rvp++)
  		{
+ #include <netdb.h>
  			register struct match *m;
  			register char **pp;
  			char **oldavp,**tavp;
***************
*** 628,633
  		{
  			register struct match *m;
  			register char **pp;
  
  			rp = *rvp;
  			if (*rp != MATCHREPL)

--- 632,640 -----
  #include <netdb.h>
  			register struct match *m;
  			register char **pp;
+ 			char **oldavp,**tavp;
+ 			struct hostent *hostpt;
+ 			extern char *macvalue();
  
  			rp = *rvp;
  			if ((*rp != MATCHREPL) && (*rp != NORMREPL))
***************
*** 630,636
  			register char **pp;
  
  			rp = *rvp;
! 			if (*rp != MATCHREPL)
  			{
  				if (avp >= &npvp[MAXATOM])
  				{

--- 637,643 -----
  			extern char *macvalue();
  
  			rp = *rvp;
! 			if ((*rp != MATCHREPL) && (*rp != NORMREPL))
  			{
  				if (avp >= &npvp[MAXATOM])
  				{
***************
*** 637,643
  					syserr("rewrite: expansion too long");
  					return;
  				}
! 				*avp++ = rp;
  				continue;
  			}
  

--- 644,655 -----
  					syserr("rewrite: expansion too long");
  					return;
  				}
! 				if (*rp == MACVALUE) {
! 				  if (macvalue(rp[1],CurEnv))
! 				    *avp++ = macvalue(rp[1],CurEnv);
! }
! 				else
! 				  *avp++ = rp;
  				continue;
  			}
  
***************
*** 642,647
  			}
  
  			/* substitute from LHS */
  			m = &mlist[rp[1] - '1'];
  # ifdef DEBUG
  			if (tTd(21, 15))

--- 654,660 -----
  			}
  
  			/* substitute from LHS */
+ 
  			m = &mlist[rp[1] - '1'];
  # ifdef DEBUG
  			if (tTd(21, 15))
***************
*** 658,663
  			}
  # endif DEBUG
  			pp = m->first;
  			while (pp <= m->last)
  			{
  				if (avp >= &npvp[MAXATOM])

--- 671,677 -----
  			}
  # endif DEBUG
  			pp = m->first;
+ 			oldavp = avp;
  			while (pp <= m->last)
  			{
  				if (avp >= &npvp[MAXATOM])
***************
*** 666,671
  					return;
  				}
  				*avp++ = *pp++;
  			}
  		}
  		*avp++ = NULL;

--- 680,695 -----
  					return;
  				}
  				*avp++ = *pp++;
+ 			}
+ 			if (*rp == NORMREPL) {
+ 			  hostbuf[0] = '\0';
+ 			  for (tavp = oldavp; tavp < avp; tavp++)
+ 			    strcat(hostbuf,*tavp);
+ 			  hostpt = gethostbyname(hostbuf);
+ 			  if (hostpt) {
+ 			    *oldavp = hostpt -> h_name;
+ 			    avp = oldavp + 1;
+ 			  }
  			}
  		}
  		*avp++ = NULL;
*** queue.c.ORIG	Fri Feb 10 06:59:20 1984
--- queue.c	Mon Aug 26 04:45:19 1985
***************
*** 105,110
  	/* output creation time */
  	fprintf(tfp, "T%ld\n", e->e_ctime);
  
  	/* output name of data file */
  	fprintf(tfp, "D%s\n", e->e_df);
  

--- 105,115 -----
  	/* output creation time */
  	fprintf(tfp, "T%ld\n", e->e_ctime);
  
+ 	/* output protocol */
+ 	if (macvalue('r',e)) {
+ 	  fprintf(tfp, "O%s\n", macvalue('r',e));
+ }
+ 
  	/* output name of data file */
  	fprintf(tfp, "D%s\n", e->e_df);
  
***************
*** 565,571
  	/*
  	**  Open the file created by queueup.
  	*/
! 
  	p = queuename(e, 'q');
  	f = fopen(p, "r");
  	if (f == NULL)

--- 570,576 -----
  	/*
  	**  Open the file created by queueup.
  	*/
!        
  	p = queuename(e, 'q');
  	f = fopen(p, "r");
  	if (f == NULL)
***************
*** 575,580
  	}
  	FileName = p;
  	LineNumber = 0;
  
  	/*
  	**  Read and process the file.

--- 580,586 -----
  	}
  	FileName = p;
  	LineNumber = 0;
+ 	define('r',NULL,e);
  
  	/*
  	**  Read and process the file.
***************
*** 595,600
  				(void) chompheader(&buf[1], FALSE);
  			break;
  
  		  case 'M':		/* message */
  			e->e_message = newstr(&buf[1]);
  			break;

--- 601,610 -----
  				(void) chompheader(&buf[1], FALSE);
  			break;
  
+ 		  case 'O':
+ 			define('r',newstr(&buf[1]),e);
+ 			break;
+ 
  		  case 'M':		/* message */
  			e->e_message = newstr(&buf[1]);
  			break;
***************
*** 628,634
  			break;
  		}
  	}
- 
  	FileName = NULL;
  }
  /*

--- 638,643 -----
  			break;
  		}
  	}
  	FileName = NULL;
  }
  /*
*** sendmail.h.ORIG	Fri Feb 10 06:59:10 1984
--- sendmail.h	Sat Aug  3 05:06:53 1985
***************
*** 290,295
  # define CONDIF		'\031'	/* conditional if-then */
  # define CONDELSE	'\032'	/* conditional else */
  # define CONDFI		'\033'	/* conditional fi */
  /*
  **  Symbol table definitions
  */

--- 290,300 -----
  # define CONDIF		'\031'	/* conditional if-then */
  # define CONDELSE	'\032'	/* conditional else */
  # define CONDFI		'\033'	/* conditional fi */
+ 
+ /* normalize Internet address operator */
+ # define NORMREPL       '\034'  /* normalized host replacement */
+ # define MACVALUE	'\035'	/* run-time macro value */
+ 
  /*
  **  Symbol table definitions
  */


!STUFFY!FUNK!
echo Extracting README
cat >README <<'!STUFFY!FUNK!'
The files in this package build the sendmail.cf files for machines at
Georgia Tech.  They are derived from the standard BSD 4.2 sendmail
files, and form a set of sendmail files we received along with PMDF
from the folks at CSNet.  The CSNet set of files were put together by
Ray Essick (essick at uiucdcs) and were a great help in putting this
package together.  Many of the individual rules were derived from
various sources posted to the Usenet net.mail and net.sources
newsgroups.  Credit is also due Rick Adams at seismo.css.gov for his
continued comments and help in debugging some of headers, and to
Stuart Stirling at emory.CSNET for help with some of the initial
debugging.

Contained in this package are the following:
1) MANIFEST which lists each file in the package, along with a
   one line description of what it does;
2) KEY which describes macros used in the sendmail files;
3) source and Makefiles for building our various sendmail.cf files;
4) overview.ms, a paper describing how mail gets routed when
   mailed to or through gatech (nroff -ms overview.ms | more);
5) uumail.c, the source to our rerouting mailer ("pathalias", which
   is used to build the mailer database, has been posted multiple times
   to the net and is not included).  See the comments at the beginning
   of the program before your try to install it;
6) PATCHES, which is a set of changes to the sendmail code, developed
   at Rutgers, and needed to be implemented to make these
   sendmail rules work optimally.  Make sure to read about the corresponding
   change to "rmail" described in the comments.
7) Files, which is a brief list of the data files which are present to
   drive the sendmail on "gatech".

The remainder of this file is an overview of the environment in which
these files were developed and are used.

The machines using "sendmail" at Georgia Tech fall into 3 basic
categories: gateway ("gatech"), department machines on a common
ethernet ("stratus", "nimbus", et.al.), and campus machines not on the
same Ethernet as "gatech" (only "gt-cmmsr" so far).  We have at least
one Ethernet loop on campus which is separate from the ICS loop
("gtss", "gtqo", et. al.).

"gatech" is intended to be the campus gateway machine.  It is on the
ICS common ethernet, has over 50 major uucp contacts known to the
outside world, has a CSNet connection, a number of direct asynchronous
links, and a set of rotored phone lines.  Sometime in the
not-too-distant future, it is possible that "gatech" will also be on
the Arpanet and/or Bitnet. It is also the "traditional" mail address
known to most outsiders.  Thus, the machine is on 3 distinct networks,
and has to be configured with the possibility of connecting to at least
1 other major international network in the near future.

The department machines currently are comprised of the Clouds research
machines "gt-stratus", "gt-cirrus", and "gt-nimbus", and the ICS/OCS
Pyramid "gitpyr".  They are connected via a common ethernet link, and
they all can speak TCP at each other.  Other machines are expected to
be added to this group before long.  Almost all of these machines have
a single phone line and/or direct links for uucp to machines that can't
speak TCP.  (We are trying to keep a consistant naming scheme in use,
and thus all campus machines will henceforth be named with the prefix
"gt-" in the name.  There are a few machines around which had
established UUCP networks connections with different names before the
decision to use this standard came into being, and their names will
probably not change (e.g., "gitpyr").)


The third class of machine on campus runs sendmail but has no TCP
connection to the others because our Net/One bridge won't pass TCP
packets across the backbone.  These sites use a phone line or Net/One
virtual circuit to connect to "gatech" and some of the other systems.
Some of these machines may talk to each other via Ethernet, but
there is no common connection amongst all of them.

The basic idea in our configuration is for users to be able to use
addresses of the forms:
		site!user, site!site2!user, user at site.UUCP
		user at site.CSNET, user at site.ARPA, user at site.MAILNET,
		user at site.BITNET user at site.DEC
and the local case:     user at site.GTNET, site:user, user%site
We'd also like to be able to use just "user at site" and let the mailer
figure it out.  Here's how my sendmail files accomplish that:

All of the internal machines are simple: they merely canonicalize the
address according to standard rule, look to see if it is a GTNET host
that they know and send the letter straight to that host. Local letters
are handled appropriately. Any other address which looks like a network
address is sent to the relay site, "gatech", except that each machine
can have a small number of direct UUCP connections to outside
machines.  Ruleset zero for these systems check for these UUCP
connections.  Note that we use a file (/usr/lib/mail/uucp.local) to
hold the UUCP connection list so that we don't have to play around with
the actual sendmail configuration if we change contacts.  The only
thing one has to do to update the list of UUCP connections available on
that host is update the file. If you run with a frozen sendmail.cf, you
also have to type "/usr/lib/sendmail -bz".

The "gatech" machine is the complex one.  Any address that the internal
machines are unable to handle gets bounced to this machine. The
"gatech" machine speaks to a plethora of people. "gatech" should be
able to recognize and route any (valid) address.  The "gatech" machine
compares UUCP addresses against a file similarl to the way the other
machines handle them.  Mail to the CSNET domain is sent to the PMDF
mailer, which queues the letter for phone transmission to the
CSnet-relay host.  Mail to the ARPA domain, since we have no direct
ARPA connection (yet), is handed to the PMDF mailer for transmission to the
CSnet-relay, which is an ARPA host.  Mail to the BITNET (IBM
derivative) and MAILNET (through MIT-multics) machines are routed to
the host defined by the $B and $M macros.  Mail to the DEC E-net is
routed to the site listed in the $E macro, currently "decwrl.arpa".
Mail to the OZ network (Australia) is routed to munnari.uucp ($Z).
Since we do not have connections to any of those networks, we instead
append the address of a known gateway to the address forming something
like: user at host.mailnet@mit-multics.arpa and then re-iterate through
ruleset 0 to get from our machine to the gateway.

Any address without a domain gets converted into an address of the form
"user at site", and it makes an attempt to intuit the domain. This is done
by checking (in order) the list of local sites, local uucp contacts (1
hop), CSNET, ARPA, BITNET, UUCP, and DEC E-net sites. In the event of a
match, the proper domain name is appended to the address and we
re-iterate through ruleset zero.  This catches a fair number of missing
domain problems and hasn't caused too much confusion about names in use
in several domains.

Finally, the "gatech" machine takes any left-over non-local names and
returns them to the sender with a message about the fact that there is
an unknown host/domain name in his letter.

The UUCP mailer on "gatech" is a re-routing mailer.  Any path or address
handed to "uumail" gets an "optimal" path supplied to it.  That is, the
program steps through the address from ultimate destination to
beginning, and if it knows a path to that site it will substitute that
path for the remainder of the user-supplied path.  For example, if the
address "a!b!c!d!e!f" is provided to the mailer, and it knows how to
get to site "d" via "z!y" (but no idea how to get to "e"), it will
rewrite the path to be "z!y!d!e!f".  The path database is built using
"pathalias" on the uucp map data obtained from the Usenix
machine ("gatech" is a regional repository of UUCP map information and
gets near-synchronous copies of map updates).
The ruleset along with "uumail" rewrites the "To:" field to look like
"f at e.UUCP" since the user-supplied address-path is probably not the
path that the mailer is going to use. Note that this means that
"uumail.m4" and "uucpm.m4" are NOT identical in function -- beware if
you decide to use one of them as a base in building your own files.
"uucpm.m4" does not muck about with the "To:" field, nor does it
reroute mail.

This uucp mechanism allows any of our users to simply address mail to
"foo at site.UUCP" and not worry about a path.  It also optimizes message
paths provided when answering news articles, and it allows our
neighbors without mail routing software to address mail to
"gatech!somesite!person" and expect the mail to get through, if
possible.  So far, no one has complained about not being able to force
a particular path through our mailer.  In the 6+ months this mechanism
has been working, I've only discovered about 6 sites not registered
with the map project and thus ccausing mail to them to fail.

That's about it.  If you find these useful in some way, great.  If you
should find bugs or possible enhancements to these files, I would
greatly appreciate hearing about it.
----
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,allegra,hplabs,ihnp4,linus,seismo,ulysses}!gatech!spaf
!STUFFY!FUNK!
echo Extracting Files
cat >Files <<'!STUFFY!FUNK!'
The following are the files that this particular sendmail configuration
uses.  These are in addition to the files /usr/lib/sendmail* and
/usr/lib/aliases*.

These files are normally set up in the directory /usr/lib/mail on each
machine.  The file uucp.local needs to be present on each machine, or
else the declaration in gtbase.m4 changed so that the uucp neighbors
are defined as a class macro in the individual .mc files.  I chose
the easy way out for here at GaTech.

Each list is assumed to be one-per-line, unless otherwise stated.


arpa.hosts -- a list of Arpa (EDU, DDN, etc.) hosts.  This is derived
	from one of the hosts.txt file from the Arpa CIC.  These also
	sometimes get posted to net.mail and/or sent out to CSNet sites
	from the CSNet NIC.

bitnet.hosts -- a list of Bitnet hosts.  This is obtained from some
	friendly Bitnet neighbor, or else taken from net.mail the
	next time it is posted there.

csnet.hosts -- a list of CSNet hosts and acceptable nicknames.  This can
	be obtained from the CSNet NIC.

decnet.hosts -- a list of DEC network hostnames.  This list is really
	a kludge and I am seriously considering removing it.  DEC considers
	the actual list to be a company secret and so the list is by
	no means complete.  I derived my copy from checking news paths
	and trading lists with other such watchers.  Each entry is
	in the list twice -- once as "site" and once as "dec-site".
	This leads to some horrible name conflicts.

mailnet.hosts -- a list of Mailnet hosts.  I have no idea where you can
	get an up-to-date copy.  Someone mailed me a copy a long time
	ago, and I haven't seen much mention since.  I know next
	to nothing about it.

uucp.hosts -- the output of pathalias when run on the uucp maps.  This
	list is of all sites reachable via uucp, one per line, with
	a "sprintf" format string specifying the path on the same
	line, separated from the hostname by a tab.  I sort mine,
	but I don't think it makes a difference.

uucp.hosts.dir, uucp.hosts.pag -- the uucp.hosts file in dbm format
	after running makedb on them (makedb was part of the last
	pathalias release).

uucp.local -- a list of all sites reachable directly via uucp from this
	site.  That is, sites for which we have L.sys info.

uumail -- the uumail program executable file.

uumail.log -- a log of uucp mail passing through our site.  Each line
	consists of the sender's address, followed by a tab, the
	destination address as it was presented to uumail from 
	sendmail, a tab, and the actual path that uumail dispatched
	the mail along.  This data can be analysed for traffic patterns,
	finding sites not listed in the uucp maps, and checking to
	see how well uumail is working.

	If the input to uumail generates an error, the third field is
	the error message generated by uumail and sent back to the
	"sender".
!STUFFY!FUNK!
echo ""
echo "End of kit 1 (of 3)"
cat /dev/null >kit1isdone
config=true
for iskit in 1 2 3; do
    if test -f kit${iskit}isdone; then
	echo "You have run kit ${iskit}."
    else
	echo "You still need to run kit ${iskit}."
	config=false
    fi
done
case $config in
    true)
	echo "You have run all your kits.  Please read README."
	;;
esac
: I do not append .signature, but someone might mail this.
exit



More information about the Mod.sources mailing list