[alt.sources] Anonymous Contact Service software v1.1, Part04/08

csu@alembic.acs.com (Dave Mack) (07/16/90)

This is the second distribution of the Anonymous Contact Service
software. The distribution consists of 8 shar files. This will
(hopefully) be the last full distribution of the system - all
future versions will be distributed as patches. The patchlevel of
this version is 1.

The ACS software provides a mechanism for posting anonymous articles,
for receiving replies to those articles which are also anonymous, and
permits prolonged anonymous conversations in which neither writer knows
the other's actual e-mail address.

This software is currently being used to provide an anonymous personals
service in alt.personals.

Dave Mack
csu@alembic.ACS.COM

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 4 (of 8)."
# Contents:  mailer/Read.Me mailer/resolve.c mailer/template.cf
# Wrapped by csu@alembic on Sun Jul 15 12:46:48 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'mailer/Read.Me' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mailer/Read.Me'\"
else
echo shar: Extracting \"'mailer/Read.Me'\" \(6735 characters\)
sed "s/^X//" >'mailer/Read.Me' <<'END_OF_FILE'
X		Read.Me - Updated 9/15/87
X
XWhat smail does:
X
X  smail is capable of handling UUCP syntax (bang paths, bang
X  domains, and at domains are supported) mail transportation
X  over UUCP/uux/rmail channels.  It will support machines that
X  only have UUCP connections, and machines with UUCP links to
X  the outside world plus a small number of local machines that
X  are reached via SMTP.  The domain intelligence is embedded
X  in the smail database (e.g. the pathalias output), not the
X  sendmail.cf file, so if you have a fancier domain structure
X  that involves SMTP or anything other than uux in the domain
X  structure, you'll want to modify the sendmail.cf file here or
X  merge pieces of the enclosed sendmail.cf into your own.
X
X  smail runs under 4.2BSD and System V, as a back end to sendmail;
X  and under System V without sendmail.  It also replaces rmail, which
X  becomes a link to smail.  In a sendmail environment, smail depends on
X  sendmail to crack the headers, as smail just deals with the envelope.
X  smail makes your host capable of using the INTERNET definition in the
X  Usenet software.
X
X  Features of smail include:
X
X  (1) Using pathalias data to choose the best route to your destination.
X  (2) Handling of user@domain, domain!user, and host!user syntax.
X  (3) Generation of domain!user syntax to be forwarded by other systems.
X  (4) Logging of traffic through your machine, by sender, recipient, and
X      size of message, so you can, track use and detect abuse of your
X      machine.
X  (5) Mail being forwarded through your machine to another uux link is
X      passed from rmail directly to uux, so there's less overhead on
X      your machine (sendmail stays out of the loop.)
X  (6) Sendmail-like alias capability for hosts without sendmail.
X  (7) Generation of RFC822 required headers for locally generated mail.
X  (8) Robust delivery scheme that reroutes only if stated path is inaccessible.
X  (8) Mail that is undeliverable is returned to sender.
X  (9) Simplicity.
X
XPrerequisites:
X
X  A copy of a recent posting of pathalias.  (The one posted
X  by Peter Honeyman in January 1986 is recommended.)
X
X  A current copy of the UUCP map, or at least a copy of the
X  appropriate part of it that you're interested in.
X
X  A properly registered domain name for your organization, such
X  as ATT.COM.  (It is possible to run smail using a domain name
X  under .UUCP, but since this can't be officially registered,
X  it is appropriate only for testing.)
X
X  You can get pathalias from the mod.sources Usenet archive
X  (contact sources-request@uunet.uu.net or uunet!sources-request)
X
X  You can get a UUCP map each month from Usenet newsgroup mod.map.
X  The UUCP map is quite large (currently about 2MB) so please don't ask
X  to have a copy mailed to you - get a copy from a nearby Usenet site.
X
X  You can get a domain name by joining the UUCP Zone.  There are
X  low membership dues for this, and a registration process that
X  will take 2-8 weeks.  This Read.Me file may be out of date by
X  the time you read it, so we ask you to contact us for current
X  dues rates and procedures.  Contact uucp-query@Stargate.COM or
X  cbosgd!stargate!uucp-query and ask for the UUCP Zone information
X  packet.  (If you already belong to a network such as CSNET, DDN,
X  or BITNET, your organization may already have a domain name.  If
X  you are also on UUCP, it is recommended that you also join the
X  UUCP Zone at the lower rate for organizations whose primary
X  affiliation is with another network.  See the file "Registry"
X  for more information.
X
XOverall structure:
X
X  smail is installed in /bin/smail with a link in /bin/rmail.  Uuxqt
X  calls rmail, which either forwards the message on to the next hop
X  directly or, on a sysetm with sendmail, calls sendmail.  sendmail
X  may decide the message should be delivered by UUCP, and invoke smail,
X  which will look up a route and invoke uux.  (Note that the choice
X  about when to invoke sendmail and when to process a message directly
X  can be configured in smail.)
X
X  smail uses a database which is generated from pathalias.  You take the
X  current UUCP map, add some local information and topology data (to tell
X  it about the domain tree) and run pathalias.  The result is sorted and
X  installed in /usr/lib/uucp/paths.  There is no hashing done on this
X  file - when smail looks up a name it uses a binary search.
X
XConfiguration considerations:
X
X  You'll note two configuration options in defs.h: HANDLE and ROUTING.
X  These control which sorts of addresses smail/rmail will handle, and
X  which type of routing they will do.  The HANDLE define only affects
X  rmail, since smail sets it implicitly.  In any case, we recommend
X  that you leave HANDLE alone, unless you are making major changes.
X
X  ROUTING has three choices: JUSTDOMAIN, ALWAYS, and REROUTE.  rmail
X  will run as JUSTDOMAIN, the defs.h default.  This means rmail will
X  only apply routing if it sees "rmail user@domain", and will just call
X  uux if it sees "rmail host!user".  (If the uux fails, it will call
X  smail -r, which will apply ALWAYS routing to try to get the mail
X  there anyway.  If the ALWAYS routing fails, then REROUTE routing is
X  applied.  This has the advantage of being low overhead on your
X  system, not second guessing a route someone else asked for, and still
X  recovering nicely from the mistakes of another system.  Your host
X  becomes a "smart host" that can get mail anywhere.)
X
X  Many people will note huge paths going through their machine.  These
X  paths are generated by replies to netnews messages, and tend to be 10
X  or 20 hops long - far longer than necessary.  If you are a bit aggressive,
X  you can change -r to -R, which will cause such failed mail to be rerouted,
X  thus, mail to a!b!c!d!e!f!g!user will look up a route to g, and send the
X  mail to route!g!user.  (If it can't find g, it will try f, then e, and
X  so on until it finds someone it recognizes.)  If you are REALLY aggressive,
X  you can change ROUTING to REROUTE in defs.h, to get the same effect for
X  ALL rmail being passed through your machine.  This may help cut phone
X  bills, but it has some disadvantages.  It can lengthen a path sometimes,
X  e.g. mail to tektronix!user might turn into ihnp4!tektronix!user if your
X  routing database says mail to tektronix goes through ihnp4.  It makes it
X  hard to route around a dead host, or to redirect traffic from a mailing
X  list to several different directions.  It may also make mail go a different
X  path than what your user thought it was, and it affects other hosts that
X  route mail through you if you set ROUTING to REROUTE in defs.h.  So only
X  do this if you know what you are doing, and are willing to live with the
X  disadvantages.
X
X#
X#@(#)Read.Me	2.5 (smail) 9/15/87
X#
END_OF_FILE
if test 6735 -ne `wc -c <'mailer/Read.Me'`; then
    echo shar: \"'mailer/Read.Me'\" unpacked with wrong size!
fi
# end of 'mailer/Read.Me'
fi
if test -f 'mailer/resolve.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mailer/resolve.c'\"
else
echo shar: Extracting \"'mailer/resolve.c'\" \(7634 characters\)
sed "s/^X//" >'mailer/resolve.c' <<'END_OF_FILE'
X/*
X**
X**  Resolve.c
X**
X**  Routes then resolves addresses into UUCP or LOCAL.
X**
X*/
X#ifndef lint
Xstatic char 	*sccsid="@(#)resolve.c	2.5 (smail) 9/15/87";
X#endif
X
X#include	<ctype.h>
X#include	<stdio.h>
X#include	"defs.h"
X
Xextern int exitstat;		/* set if address doesn't resolve 	*/
Xextern enum ehandle handle;	/* what mail we can handle		*/
Xextern enum edebug debug;	/* verbose and debug modes		*/
Xextern enum erouting routing;	/* when to route addresses		*/
Xextern char hostdomain[];	/* */
Xextern char hostname[];		/* */
Xextern char *pathfile;		/* location of path database		*/
Xextern int getcost;		/* get path cost even if not routing    */
X
Xchar *sform();
X
X/*
X**
X**  rsvp(): how to resolve addresses.
X**
X**  After parsing an address into <form>, the resolved form will be
X**  rsvp( form ).  If == ROUTE, we route the parsed address and parse again.
X**
X*/
X
X# define rsvp(a) table[(int)a][(int)handle]
X
Xenum eform table[5][3] = {
X/*	all		justuucp	none */
X{	ERROR, 		ERROR, 		ERROR }, 	/* error */
X{	LOCAL, 		LOCAL,	 	LOCAL }, 	/* local */
X{	ROUTE, 		LOCAL, 		LOCAL }, 	/* domain */
X{	UUCP, 		UUCP, 		LOCAL }, 	/* uucp */
X{	ERROR, 		ERROR, 		ERROR }};	/* route */
X
X/*
X**
X**  resolve(): resolve addresses to <host, user, form>.
X**
X**  This is a gnarly piece of code, but it does it all.  Each section 
X**  is documented.
X**
X*/
X
Xenum eform
Xresolve( address, domain, user , cost)
Xchar *address;				/* the input address 	*/
Xchar *domain;				/* the returned domain 	*/
Xchar *user;				/* the returned user 	*/
Xint *cost;				/* the returned cost 	*/
X{
X	enum eform form;		/* the returned form	*/ 
X	enum eform parse();		/* to crack addresses	*/
X	int parts;			/* to ssplit addresses	*/
X	char *partv[MAXPATH];		/* "  "      "		*/
X	char temp[SMLBUF];		/* "  "      "		*/
X	int i;
X		
X
X/*
X**  If we set REROUTE and are prepared to deliver UUCP mail, we split the 
X**  address apart at !'s and try to resolve successively larger righthand 
X**  substrings until we succeed.  Otherwise, we just resolve the whole thing 
X**  once.
X*/
X	if ((routing == REROUTE) && (rsvp( UUCP ) == UUCP)) {
X		parts = ssplit( address, '!', partv );
X	} else {
X		parts = 1;
X		partv[0] = address;
X	}
X/*
X**  This for(i) loop selects successively larger
X**  righthand substrings of the address.
X*/
X	for( i = parts - 1; i >= 0; i-- ) {
X/*
X**  Parse the address.
X*/
X		(void) strcpy( temp, partv[i] );
X		form = parse( temp, domain, user );
X
XDEBUG("resolve: parse address '%s' = '%s' @ '%s' (%s)\n",
X	temp,user,domain,sform(form));
X
X/*
X**  If we are looking at a substring (that's not the entire string)
X**  which parses to a LOCAL address, we skip to the next larger substring.
X*/
X		if((i != 0) && (form == LOCAL))
X			continue;
X/*
X**  Routing, when required, is the next step.
X**  We route the address if we have a ROUTE form
X**  or if we have a UUCP form and we are told to
X**  route ALWAYS or REROUTE (i.e., routing != JUSTDOMAIN)
X*/
X		if((rsvp( form ) == ROUTE)
X		 ||((rsvp( form ) == UUCP) && (routing != JUSTDOMAIN ))) {
X
X			int look_smart = 0;
X
X			if((routing == REROUTE) && (i == 0)) {
X				look_smart = 1; /* last chance */
X			}
X
X			/* route() puts the new route in 'temp' */
X			if(route(domain,user,look_smart,temp,cost) != EX_OK) {
X				continue;	/* If routing fails, try
X						/* next larger substring.
X						/* */
X			}
X/*
X**  After routing, reparse the new route into domain and user. 
X*/
X			form = parse( temp, domain, user );
X
XDEBUG("resolve: parse route '%s' = '%s' @ '%s' (%s)\n",
X	temp,user,domain,sform(form));
X
X		} else if((getcost) && (rsvp(form) == UUCP)) {
X			/* get the cost of the route
X			** even if we're not going route the mail.
X			** this allows smart decisions about using
X			** the -r flag to uux when we're not routing.
X			*/
X			char junk[SMLBUF];
X			if(route(domain,user,0,junk,cost) != EX_OK) {
X				continue;	/* If routing fails, try
X						/* next larger substring.
X						/* */
X			}
X		}
X		break;	/* route is resolved */
X	}
X/*
X**  For LOCAL mail in non-local format, we rewrite the full address into 
X**  <user> and leave <domain> blank.
X*/
X	if ((rsvp( form ) == LOCAL) && (form != LOCAL )) {
X		build( domain, user, form, temp );
X		(void) strcpy( user, temp );
X		(void) strcpy( domain, "" );
X		form = LOCAL;
X	}
X/*
X**  If we were supposed to route an address but failed (form == ERROR), 
X**  or after routing we are left with an address that still needs to
X**  be routed (rsvp( form ) == ROUTE), complain.
X*/
X	if ((form == ERROR) || (rsvp( form ) == ROUTE )) {
X		exitstat = EX_NOHOST;
X		ADVISE("resolve failed '%s' = '%s' @ '%s' (%s)\n",
X			address, user, domain, sform(form));
X		form = ERROR;
X	} else {
X		ADVISE("resolve '%s' = '%s' @ '%s' (%s)\n",
X			address, user, domain, sform(form));
X	}
X	return ( form );
X}
X
X/*
X**
X**  route(): route domain, plug in user.
X**
X**  Less complicated than it looks.  Each section is documented.
X**
X*/
X
Xroute(domain, user, look_smart, result, cost)
Xchar *domain;			/* domain or host name 	*/
Xchar *user;			/* user name 		*/
Xint look_smart;			/* do we try to route through a smarter host? */
Xchar *result;			/* output route 	*/
Xint *cost;			/* cost of output route */
X{
X	int	uucpdom = 0;
X	int	domains, step;			/* to split domain	*/
X	char	*domainv[MAXDOMS];		/* "  "     "		*/
X	char	temp[SMLBUF], path[SMLBUF];
X
X/*
X**  Fully qualify the domain, and then strip the last (top level domain) 
X**  component off, so that we look it up separately.
X*/
X	temp[0] = '.';
X	(void) strcpy(temp+1, domain );
X
X	domains = ssplit( temp+1, '.', domainv );
X
X/*
X** check target domain for the local host name and host domain.
X** if it matches, then skip the lookup in the database.
X** this prevents mail loops for cases where SMARTHOST is defined
X** in the routing table, but the local host is not.  It also is
X** a little faster when the local host is the target domain.
X*/
X	if((strcmpic(domain, hostname) == 0)
X	|| (strcmpic(domain, hostdomain) == 0)) {
X		step = 0;
X		*cost = 0;
X		(void) strcpy(path, "%s");
XDEBUG("route: '%s' is local\n", domain);
X		goto route_complete;
X	}
X
X	/* If the domain ends in .UUCP, trim that off. */
X	if((domains > 0) && isuucp(domainv[domains-1])) {
X		domains--;
X		domainv[domains][-1] = '\0';
X		uucpdom = 1;
X	}
X/*
X**  Try to get the path for successive components of the domain.  
X**  Example for osgd.cb.att.uucp:
X**	osgd.cb.att
X**	cb.att
X**	att
X**	uucp ( remember stripping top level? )
X**	SMARTHOST
X**  Returns with error if we find no path.
X*/
X	for(step = 0; (step < domains); step++) {
X		if((getpath(domainv[step]-1, path, cost) == EX_OK) /* w/ dot */
X		|| (getpath(domainv[step]  , path, cost) == EX_OK))/* no dot */
X			break;
X	}
X
X	if(step == domains) {
X	/*
X	** we've looked at each component of the domain without success
X	*/
X		/*
X		** If domain is a UUCP address, look for a UUCP gateway.
X		*/
X		if((uucpdom == 0) || (getpath(".UUCP", path, cost) != EX_OK)) {
X			/*
X			** The domain not is a UUCP address, or we can't
X			** find a UUCP gateway.  If this is our last chance,
X			** look for a smarter host to deliver the mail.
X			*/
X			if((look_smart == 0)
X			|| (getpath(SMARTHOST, path, cost) != EX_OK)) {
X				/*
X				** All our efforts have been in vain.
X				** Tell them the bad news.
X				*/
X				DEBUG("route '%s' failed\n", domain);
X				return( EX_NOHOST );
X			}
X		}
X	}
X
Xroute_complete:
X
XDEBUG("route:  '%s' (%s) = '%s' (%d)\n", domain, domainv[step]?domainv[step]:"NULL", path, *cost);
X
X/*
X**  If we matched on the entire domain name, this address is fully resolved, 
X**  and we plug <user> into it.  If we matched on only part of the domain 
X**  name, we plug <domain>!<user> in.  
X*/
X	build(domain, user, (step == 0) ? LOCAL : UUCP, temp);
X	(void) sprintf(result, path, temp);
X	return( EX_OK );
X}
END_OF_FILE
if test 7634 -ne `wc -c <'mailer/resolve.c'`; then
    echo shar: \"'mailer/resolve.c'\" unpacked with wrong size!
fi
# end of 'mailer/resolve.c'
fi
if test -f 'mailer/template.cf' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mailer/template.cf'\"
else
echo shar: Extracting \"'mailer/template.cf'\" \(8435 characters\)
sed "s/^X//" >'mailer/template.cf' <<'END_OF_FILE'
X############################################################
X#
X#	SENDMAIL CONFIGURATION FILE
X#
X#	supports internet style addressing
X#	over UUCP and ethernet links.
X#
X#	A product of the UUCP Project.
X#
X#	@(#)template.cf	2.5 (smail) 9/15/87
X#
X############################################################
X
X
X############################################################
X#
X#  Local configuration options - HINTS
X#
X# Host name and domain name macros.
X#
X#	Dw sets $w
X#	DD sets $D
X#	CD sets $=D
X#
X# $D and $=D list all domains in which this host sits.
X# $D goes into outbound addresses, i.e. "user@$w.$D".
X# $A is another domain for which this host is 'authoritative'
X# it will will be turned into $D.
X
XCF_HOST
XCF_DOMAIN
XCF_AUTHORITY
XCF_DCLASS
X
X# Preemptive ether connections.  We prefer these connections 
X# over both designated transport mechanisms and the general depository.
X# You can add more classes (here and in S0).
X
X# /etc/hosts.smtp might be a link to /etc/hosts
X#
XCF_SMTP
X
X# Mock top-level domain names.  These name designate a transport mechanism
X# and appear internally only, set in S3, used in S0, and removed in S4 and
X# (possibly) the ruleset for the particular mailer.  
X
XCTETHER UUX
X
X# Relay host.  Used at the end of S0 as the general depository for 
X# addresses which didn't resolve locally.  
X
XDRrelay
X
X#
X#  End Local configuration options
X#
X############################################################
X
X############################################################
X#
X#	General configuration information
X#
X############################################################
X
XDVsmail2.5/CF_DATE
X
X##########################
X#     Special macros     #
X##########################
X
X# official hostname
XDj$w.$D
X# my name
XDnMAILER-DAEMON
X# UNIX header format
XDlFrom $g  $d
X# delimiter (operator) characters
XDo.:%@!^=/[]
X# format of a total name
XDq$g$?x ($x)$.
X# SMTP login message
XDe$j Sendmail $v/$V ready at $b
X
X
X###################
X#     Options     #
X###################
X
X# location of alias file
XOA/usr/lib/aliases
X# default delivery mode (deliver in background)
XOdbackground
X# (don't) connect to "expensive" mailers
X#Oc
X# temporary file mode
XOF0644
X# default GID
XOg1
X# location of help file
XOH/usr/lib/sendmail.hf
X# log level
XOL9
X# default messages to old style
XOo
X# queue directory
XOQ/usr/spool/mqueue
X# read timeout -- violates protocols
XOr2h
X# status file
XOS/usr/lib/sendmail.st
X# queue up everything before starting transmission
XOs
X# default timeout interval
XOT3d
X# time zone names (V6 only)
XOtPST,PDT
X# default UID
XOu1
X# wizard's password
XOWvoidpasswords
X
X###############################
X#     Message precedences     #
X###############################
X
XPfirst-class=0
XPspecial-delivery=100
XPjunk=-100
X
X#########################
X#     Trusted users     #
X#########################
X
XTroot
XTdaemon
XTuucp
XTnetwork
X
X#############################
X#     Format of headers     #
X#############################
X
X#H?P?Return-Path: <$g>
XHReceived: $?sfrom $s 
X	$.by $j ($v/$V)
X	id $i; $b
XH?D?Resent-Date: $a
XH?D?Date: $a
XH?F?Resent-From: $q
XH?F?From: $q
XH?x?Full-Name: $x
XHSubject:
X# HPosted-Date: $a
X# H?l?Received-Date: $b
XH?M?Resent-Message-Id: <$t.$i@$j>
XH?M?Message-Id: <$t.$i@$j>
X
X############################################################
X#
X#		REWRITING RULES
X#
X
X
X###########################
X#			  #
X#  Name Canonicalization  #
X#			  #
X###########################
XS3
X
X# basic textual canonicalization
XR<>			$@@				turn into magic token
XR$*<$+>$*		$2				basic RFC821/822 parsing
XR$+ at $+		$1@$2				"at" -> "@" for RFC 822
XR$*<$*>$*		$1$2$3				in case recursive
X
X# handle route-addr <@a,@b,@c:user@d> 
XR@$+,$+			@$1:$2				change all "," to ":"
XR@$+:$+			$@<@$1>:$2			handle <route-addr>
XR$+:$*;@$+		$@$1:$2;@$3			list syntax
X
X# Rewrite address into a domain-based address.  Any special mock domain names 
X# (like UUX) should be defined on the CT line and removed (if necessary) 
X# in S4.  You can use them in S0 for designated transport mechanisms.
X
X# Delimiters with precedence over @.  Add yours here.
X
X# The @ delimiter.  Leave this alone.
XR$+@$+			$:$1<@$2>			focus on domain
XR$+<$+@$+>		$1$2<@$3>			move gaze right
XR$+<@$+>		$@$1<@$2>			already canonical
X
X# Delimiters with precedence below @.  Add yours here.
XR$+^$+			$1!$2				convert ^ to !
XR$-!$+			$@$2<@$1.UUX>			resolve uucp names
XR$+.!$+			$@$2<@$1>			domain.!host
XR$+!$+			$@$2<@$1>			domain!host
X
X# % is a low precedence @.
XR$*%$*			$@$>3$1@$2			%->@ and retry
X
X############################################################
X#
X#    		RULESET ZERO PREAMBLE
X#
X############################################################
X
XS0
X
X# first make canonical
XR$*<$*>$*		$1$2$3				defocus
XR$+			$:$>3$1				make canonical
X
X# handle special cases.....
XR@			$#local$:MAILER-DAEMON		handle <> form
XR$*<@[$+]>$*		$#ether$@[$2]$:$1@[$2]$3	numeric internet spec
X
X# strip local stuff
XR$*<@$-.$w.$D>$*	$1<@$2>$3			thishost.mydom
XCF_GATEWAYR$*<@$-.$D>$*	$1<@$2>$3			mydom
XR$*<@$-.$w.$=D>$*	$1<@$2>$4			thishost.anydom
XR$*<@$-.$w.$A>$*	$1<@$2>$3			thishost.anotherdom
XR$*<@$-.$A>$*		$1<@$2>$3			anotherdom
XR$*<@$-.$w.$=T>$*	$1<@$2>$4			thishost.mockdom
XCF_GATEWAYR$*<$*$w>$*	$1<$2>$3			thishost
XR$*<$*.>$*		$1<$2>$3			drop trailing dot
XR<@>:$+			$@$>0$1				strip null route, retry
XR$+<@>			$@$>0$1				strip null addr, retry
X
X
X###############################################
X#    Machine dependent part of ruleset zero   #
X###############################################
X
X# Preemption: for a host on a known link turn the domain spec into a
X# mock domain indicating the link.  One set of these rules for each of 
X# the F classes listed in the local configuration options.
X
XR$*<$*$=E.$D>$*			$:$1<$2$3.ETHER>$4	etherhost.mydomain
XR$*<$*$=E.$=D>$*		$:$1<$2$3.ETHER>$5	etherhost.anydomain
XR$*<$*$=E.$A>$*			$:$1<$2$3.ETHER>$4	etherhost.anotherdomain
XR$*<$*$=E.$=T>$*		$:$1<$2$3.ETHER>$5	etherhost.mock-domain
XR$*<$*$=E>$*			$:$1<$2$3.ETHER>$4	etherhost
X
X# Designated delivery: use the indicated transport mechanism.  One of
X# these rules for each of the mock domains defined in $=T.  You can
X# remove these if you just want general disposition.  HINTS.
X
X# Designated delivery:
XR$*<@$=U.UUX>$*		$#uux$@$2$:$1$3			known uucphost
XR$*<@$=E$+.ETHER>$*	$#ether$@$2$:$1@$2$4		known etherhost
XR$*<@$+.ETHER>$*	$#ether$@$2$:$1@$2$3		etherhost
X
X# throw out mock domain name now
XR$*<$*.$=T>$*		$1<$2>$4
X
X# General disposition of remote mail (comment out all but one).  You
X# might add to this list, if you have other "smarter" mailers.  HINTS.
X
XR$*<@$->:$+		$#uux$@$2$:$1$3			forward to $2
XR$*<@$*>$*		$#uux$@$2$:$1$3			hand to uucp
X#R$*<@$*>$*		$#uux$@$R$:$1@$2$3		hand to uucp relay
X#R$*<@$*>$*		$#ether$@$R$:$1@$2$3		hand to ether relay
X#R$*<$*>$*		$#error$:unknown address $1$2$3	don't hand anywhere
X
X# local delivery
XR$+			$#local$:$1			user
X
X############################################################
X#
X# 		Local and Program Mailer specification
X#
X############################################################
X
XCF_SVMAILMlocal, P=CF_LOCALMAIL, F=lsDFMhumSU, S=10, R=20, A=rmail $u
XCF_BSMAILMlocal, P=CF_LOCALMAIL, F=rlsDFMmn, S=10, R=20, A=mail -d $u
XMprog,	P=/bin/sh,   F=lsDFMe,   S=10, R=20, A=sh -c $u
X
XS10
XR@			MAILER-DAEMON	errors to mailer-daemon
XCF_HIDDENHOSTSR$+<@$+.$j>$*		$1<@$j>$3	hide anydom.$j under $j
X
XS20
X
X############################################################
X#
X#    		UUCP Mailer specification
X#
X############################################################
X
XMuux,	P=/bin/smail, F=sDFMhum, S=14, R=24, M=100000,
X	A=smail -vH$j $h!$u
X
XS14
XR$+<@$=E>		$1			user@etherhost -> user
XR$*<@$+>$*		$@$1<@$2>$3		already ok
XCF_HIDDENHOSTSR$+<@$+.$j>$*		$1<@$j>$3		hide anydom.$j under $j
XR$+			$@$1<@$j>		add our full address
X
XS24
X
X############################################################
X#
X#    		SMTP ethernet mailer
X#
X############################################################
X
XMether,	P=[IPC], F=msDFMuCXP, S=11, R=21, A=IPC $h
X
XS11
XR$*<@$+>$*		$@$1<@$2>$3		already ok
XR$+			$@$1<@$w>		add our hostname
X
XS21
X
X#################################
X#  Final Output Post-rewriting  #
X#################################
X
X# This rewrites the internal $=T mock domains into their external form.
X# The default is to replace the mock domain name with $D.
X# The last two lines are stock.
X
XS4
XR@			$@				handle <> error addr
XR$+<@$-.UUX>		$2!$1				u@host.UUX => host!u
XR$*<$*$=T>$*		$:$1<$2$D>$4			change local info
XR$*<$+>$*		$1$2$3				defocus
XR@$+:$+:$+		@$1,$2:$3			<route-addr> canonical
END_OF_FILE
if test 8435 -ne `wc -c <'mailer/template.cf'`; then
    echo shar: \"'mailer/template.cf'\" unpacked with wrong size!
fi
# end of 'mailer/template.cf'
fi
echo shar: End of archive 4 \(of 8\).
cp /dev/null ark4isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 8 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0