/******************************************************/
/* This ease file generated by cfc from a sendmail.cf */
/* file. It must be edited by hand before being fed   */
/* to ease!                                           */
/******************************************************/

#define eval(x)"$&"x	/* for RUTGERS $& */


bind
	/* RULESET BINDINGS GO HERE (cfc) */

/* Modified for Domain style names. 05/26/85 by Jeffrey I. Schiller */
/* Actually, most of this file is stolen directly from eddie's, in order */
/* to handle uucp addresses. -- AMBAR 5/19/87 */
/* Hacked in Cw line to allow mail to be sent to beacon.mit.edu -- SRZ 9/13/87 */
/* ############################################################ */

/* SENDMAIL CONFIGURATION FILE */

/* @(#)athena.mc	2.0		4/19/84 */

/* ############################################################ */


/* ############################################################ */
/* ###	local info */
/* ############################################################ */

/* #domain names */
macro
	D = "MIT.EDU";
class
	D = { MIT.EDU };

/* #official name */
macro
	m_oname = "${m_sitename}";

/* UUCP name */
macro
	U = "garp";

/* Magic ENET pathway */
/* DEdecvax!decwrl!rhea */

/* Names that this machine is also known as */
class
	w = { GARP };

/* Temporary bogus "domains" which should not go outside this machine */
class
	T = { UUX, TCP, UUCPS };

/* ############################################################ */

/* General configuration information */

/* This information is basically just "boiler-plate"; it must be */
/* there, but is essentially constant. */

/* Information in this file should be independent of location -- */
/* i.e., although there are some policy decisions made, they are */
/* not specific to Berkeley per se. */

/* @(#)base.m4	4.3		8/30/83 */

/* ############################################################ */

/* @(#)version.m4	4.7		8/31/83 */

macro
	V = "4.7";


/* ########################## */
/* ###   Special macros   ### */
/* ########################## */

/* my name */
macro
	m_daemon = "MAILER-DAEMON";
/* UNIX header format */
macro
	m_ufrom = "From ${m_sreladdr}  ${m_udate}";
/* delimiter (operator) characters */
macro
	m_addrops = ".:%@!^=/[]";
/* format of a total name */
macro
	m_defaddr = "${m_sreladdr}ifset (m_sname,  (${m_sname}))";
/* SMTP login message */
macro
	m_smtp = "${m_oname} Sendmail ${m_version}/${V} ready to play at ${m_adate}";

/* forwarding host -- redefine this if you can't talk to the relay directly */
/* DF$R */

/* ################### */
/* ###   Options   ### */
/* ################### */

/* location of alias file */
options
	o_alias = "/site/usr/lib/aliases";
/* default delivery mode (deliver in background) */
options
	o_delivery = d_background;
/* (don't) connect to "expensive" mailers */
/* #Oc */
/* temporary file mode */
options
	o_tmode = "0644";
/* default GID */
options
	o_gid = "1";
/* location of help file */
options
	o_fsmtp = "/usr/lib/sendmail.hf";
/* log level */
options
	o_slog = "9";
/* default messages to old style */
options
	o_hformat = "";
/* queue directory */
options
	o_qdir = "/usr/spool/mqueue";
/* read timeout -- violates protocols */
options
	o_tread = "2h";
/* status file */
options
	o_flog = "/usr/lib/sendmail.st";
/* queue up everything before starting transmission */
options
	o_safe = "";
/* default timeout interval */
/* #OT1d		 */
options
	o_qtimeout = "3d";
/* time zone names (V6 only) */
options
	o_timezone = "EST,EDT";
/* default UID */
options
	o_dmuid = "1";
/* wizard's password */
options
	o_wizpass = "*";

/* ############################### */
/* ###   Message precedences   ### */
/* ############################### */

precedence
	first-class = 0;
precedence
	special-delivery = 100;
precedence
	junk = -100;

/* ######################### */
/* ###   Trusted users   ### */
/* ######################### */

trusted
	{ root };
trusted
	{ daemon };
trusted
	{ uucp };
trusted
	{ network };
trusted
	{ henry };

/* ############################# */
/* ###   Format of headers   ### */
/* ############################# */

header
	for (f_return) {
		define ("Return-Path:", " <${m_sreladdr}>");
	};
header
	define ("Received:", " ifset (m_shostname, from ${m_shostname} )by ${m_oname} ifset (Q, via ${Q} )ifset (m_protocol, with ${m_protocol} )ifset (P, with ${P} )with sendmail-${m_version}/${V} \
id <${m_qid}@${m_oname}>; ${m_adate}");
header
	for (f_date) {
		define ("Resent-Date:", " ${m_odate}");
	};
header
	for (f_date) {
		define ("Date:", " ${m_odate}");
	};
header
	for (f_from) {
		define ("Resent-From:", " ${m_defaddr}");
	};
header
	for (f_from) {
		define ("From:", " ${m_defaddr}");
	};
header
	for (f_full) {
		define ("Full-Name:", " ${m_sname}");
	};
header
	define ("Subject:", "");
/* HPosted-Date: $a */
/* H?l?Received-Date: $b */
header
	for (f_mesg) {
		define ("Resent-Message-Id:", " <${m_ctime}.${m_qid}@${m_oname}>");
	};
header
	for (f_mesg) {
		define ("Message-Id:", " <${m_ctime}.${m_qid}@${m_oname}>");
	};

/* ########################### */
/* ###   Rewriting rules   ### */
/* ########################### */


/* ################################ */
/* #  Sender Field Pre-rewriting  # */
/* ################################ */

/* These are sample field definitons (cfc) */

field
	zero_or_more : match (0*);
	one_or_more : match (1*);
	exactly_one : match (1);
	any_in_? : match (1) in ?;
	any_not_in_? : match (0) in ?;

ruleset
	RULESET_1 {
/* #R$*<$*>$*		$1$2$3				defocus */

/* ################################### */
/* #  Recipient Field Pre-rewriting  # */
/* ################################### */
	}
ruleset
	RULESET_2 {
/* #R$*<$*>$*		$1$2$3				defocus */

/* ################################# */
/* #  Final Output Post-rewriting  # */
/* ################################# */
	}
ruleset
	RULESET_4 {

	if (@)	/* handle <> error addr */
		return ();
	if ( zero_or_more < one_or_more > zero_or_more )	/* defocus */
		retry ($1$2$3);

/* Remove internal uucp syntax marker */
	if ( one_or_more @ one_or_more ."UUCPS" zero_or_more )	/* u@h.UUCPS => h!u */
		retry ($2!$1$3);

/* Remove bogus routing "domains" */
	if ( one_or_more @ one_or_more . any_in_T  zero_or_more )
		retry ($1@$2$4);

/* delete duplicate local names -- mostly for arpaproto.mc */
	if ( zero_or_more @ any_in_w .$D: one_or_more @ any_in_w .$D)	/* @ucb:u@ucb => u@ucb */
		retry ($1$3@$m_oname);
	if ( one_or_more % any_in_w @ any_in_w )	/* u%UCB@UCB => u@UCB */
		retry ($1@$m_oname);
	if ( one_or_more % any_in_w @ any_in_w .$D)	/* u%UCB@UCB => u@UCB */
		retry ($1@$m_oname);
	if ( one_or_more % any_in_w .$D@ any_in_w .$D)	/* u%UCB@UCB => u@UCB */
		retry ($1@$m_oname);
	if ( any_in_w ! one_or_more @ any_in_w .$D)	/* ucb!u@ucb => u@ucb */
		retry ($2@$m_oname);

/* #R$+%$=w@$=w.$D		$1@$3.$D */

	if (@ one_or_more : one_or_more : one_or_more )	/* <route-addr> canonical */
		return (@$1,$2:$3);

/* ########################### */
/* #  Name Canonicalization  # */
/* ########################### */
	}
ruleset
	RULESET_3 {

/* handle "from:<>" special case */
	if (<>)	/* turn into magic token */
		return (@);

/* basic textual canonicalization */
	if ( zero_or_more < one_or_more > zero_or_more )	/* basic RFC821/822 parsing */
		retry ($2);
	if ( one_or_more " at " one_or_more )	/* "at" -> "@" for RFC 822 */
		retry ($1@$2);
	if ( zero_or_more < zero_or_more > zero_or_more )	/* in case recursive */
		retry ($1$2$3);

/* make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later */
	if (@ one_or_more , one_or_more )	/* change all "," to ":" */
		retry (@$1:$2);

/* localize and dispose of domain-based addresses */
	if (@ one_or_more : one_or_more )	/* handle <route-addr> */
		return (RULESET_6 (<@$1>:$2));

/* more miscellaneous cleanup */
	if ( one_or_more )	/* host dependent cleanup */
		next (RULESET_8 ($1));
	if ( one_or_more : zero_or_more ;@ one_or_more )	/* list syntax */
		return ($1:$2;@$3);
	if ( one_or_more @ one_or_more )	/* focus on domain */
		next ($1<@$2>);
/* #Line below edited 5/4/85 to be line below it. This prevents mailer loop */
/* #R$+<$+@$+>		$1$2<@$3>			move gaze right */
	if ( one_or_more < one_or_more @ one_or_more >)	/* move gaze right */
		next ($1$2<@$3>);
	if ( one_or_more <@ one_or_more >)	/* already canonical */
		return (RULESET_6 ($1<@$2>));

/* convert old-style addresses to a domain-based address */
	if ( one_or_more % exactly_one )	/* user%hosta%hostb */
		return (RULESET_6 ($1<@$2>));
	if ( one_or_more % one_or_more )	/* user%host */
		return (RULESET_6 ($1<@$2>));
	if ( exactly_one : one_or_more )	/* host:user */
		return (RULESET_6 ($2<@$1>));
/* #R$-.$+			$@$>6$2<@$1>			host.user */
	if ( one_or_more ^ one_or_more )	/* convert ^ to ! */
		retry ($1!$2);
	if ( one_or_more ! exactly_one . one_or_more ! one_or_more )	/* prefer domain to route */
		next ($2.$3!$4);
	if ( one_or_more .! one_or_more )	/* domain.!host */
		return (RULESET_6 ($2<@$1>));
	if ( exactly_one ! one_or_more )	/* adjacent uucp names */
		return (RULESET_6 ($2<@$1."UUCPS">));
	if ( one_or_more ! one_or_more )	/* domain!host */
		return (RULESET_6 ($2<@$1>));
	if ( exactly_one = one_or_more )	/* resolve bitnet names */
		return (RULESET_6 ($2<@$1."BITNET">));

/* ############################################################ */
/* ############################################################ */
/* ##### */
/* #####		RULESET ZERO PREAMBLE */
/* ##### */
/* #####	The beginning of ruleset zero is constant through all */
/* #####	configurations. */
/* ##### */
/* #####		@(#)zerobase.m4	4.1		7/25/83 */
/* ##### */
/* ############################################################ */
/* ############################################################ */

	}
ruleset
	RULESET_0 {

/* first make canonical */
	if ( zero_or_more < zero_or_more > zero_or_more )	/* defocus */
		retry ($1$2$3);
	if ( one_or_more )	/* make canonical */
		next (RULESET_3 ($1));

/* handle special cases..... */
	if (@)	/* handle <> form */
		resolve (mailer (local),
				user (MAILER-DAEMON));
	if ( zero_or_more <@[ one_or_more ]> zero_or_more )	/* numeric internet spec */
		resolve (mailer (tcp),
				host ([$2]),
				user ($1@[$2]$3));

/* now delete the local info */
	if ( zero_or_more < zero_or_more  any_in_w ."LOCAL"> zero_or_more )	/* thishost.LOCAL */
		retry ($1<$2>$4);
	if ( zero_or_more < zero_or_more  any_in_w ."ARPA"> zero_or_more )	/* thishost.parentdomain */
		retry ($1<$2>$4);
	if ( zero_or_more < zero_or_more  any_in_w ."UUCPS"> zero_or_more )	/* thishost.parentdomain */
		retry ($1<$2>$4);
	if ( zero_or_more < zero_or_more  any_in_w ."Athena"> zero_or_more )
		retry ($1<$2>$4);
	if ( zero_or_more < zero_or_more  any_in_w ."MIT"."EDU"> zero_or_more )	/* thishost */
		retry ($1<$2>$4);
	if ( zero_or_more < zero_or_more  any_in_w .$D> zero_or_more )	/* thishost.parentdomain */
		retry ($1<$2>$4);
	if ( zero_or_more < zero_or_more  any_in_w > zero_or_more )	/* thishost */
		retry ($1<$2>$4);
	if ( zero_or_more < zero_or_more .> zero_or_more )	/* drop trailing dot */
		retry ($1<$2>$3);
	if (<@>: zero_or_more )	/* retry after route strip */
		return (RULESET_0 ($1));
	if ( zero_or_more <@>)	/* strip null trash & retry */
		return (RULESET_0 ($1));

/* ################################## */
/* #  End of ruleset zero preamble  # */
/* ################################## */


/* ############################################### */
/* ###  Machine dependent part of rulset zero  ### */
/* ############################################### */

/* First Process local mail (for now, there are no "local" hosts). */

	if ( zero_or_more <@ zero_or_more ."LOCAL"> zero_or_more )
		resolve (mailer (ether),
				host ($2),
				user ($1<@$2.LOCAL>$3));
/* strip off parent domain from host names of our parent domain */
/* #R$*<@$=S.$D>$*		$1<@$2>$3			 */
/* Hack to send directly any mail routed through ANY athena host in same domain */
/* #R$+%$+<@$=S.$D>$*		$@$>0$1<@$2>$4 */
/* #R$+@$+<@$=S.$D>$*		$@$>0$1<@$2>$4 */

/* Handle user-specified delivery: */
	if ( zero_or_more <@ one_or_more ."BITNET"> zero_or_more )
		resolve (mailer (tcp),
				host (MITVMA.MIT.EDU),
				user ($1<@$2.BITNET>$3));
	if ( zero_or_more <@ one_or_more ."MAILNET"> zero_or_more )
		resolve (mailer (tcp),
				host (MULTICS.MIT.EDU),
				user ($1<@$2.MAILNET>$3));
	if ( zero_or_more <@ one_or_more ."CSNET"> zero_or_more )
		resolve (mailer (tcp),
				host (RELAY.CS.NET),
				user ($1<@$2.CSNET>$3));
	if ( zero_or_more <@"LOTUS"."COM"> zero_or_more )
		resolve (mailer (uucp),
				host (lotus),
				user ($1));
	if ( zero_or_more <@"SOFT21"."RIVERSIDE"."CA"."US"> zero_or_more )
		resolve (mailer (uucp),
				host (soft21),
				user ($1));
	if ( zero_or_more <@ one_or_more ."TCP"> zero_or_more )
		resolve (mailer (tcp),
				host ($2),
				user ($1<@$2>$3));
	if ( zero_or_more <@ one_or_more ."UUX"> zero_or_more )
		resolve (mailer (uucp),
				host ($2),
				user ($1$3));
/* chaosnet */
	if ( one_or_more <@ any_in_C >)
		resolve (mailer (tcp),
				host (EDDIE.MIT.EDU),
				user ($1%$2<@EDDIE.MIT.EDU>));

/* Send mail on the parent domain NOW. */
/* #R$*<@$+.$D>$*		$#tcp$@$2.$D$:$1<@$2.$D>$3 */

/* special case ...!nondomain must be uucp */
	if ( zero_or_more <@ exactly_one ."UUCPS"> zero_or_more )
		resolve (mailer (uucp),
				host ($2),
				user ($1$3));

/* The following should be rewritten when MX-record versions of  */
/* sendmail exist. */

/* Now,to see if a host is UUCP or TCP, we use a gross hack: */
/* a.b.c. resolves to a.b.c if a.b.c is a valid TCP host */
/* Note that this is doomed to failure if the canonicalization */
/* returns a "soft" failure.  To reduce the chance that we'll get  */
/* screwed by flakey name servers, we try twice. */
/* Sendmail SHOULD just drop the message back into the queue if  */
/* it gets a soft NS failure on the expand. */

/* A better way would be to use a version of sendmail which understands */
/* MX mail forwarding records. */

	if ( zero_or_more <@ one_or_more > zero_or_more )	/* canonicalize */
		next ($1<@canon ($2)>$3);
	if ( zero_or_more <@ one_or_more > zero_or_more )	/* check with . */
		next ($1<@canon ($2.)>$3);

/* let's see if it resolved (Kludge alert!) */
	if ( zero_or_more <@ one_or_more .> zero_or_more )	/* Nope, try it again... */
		next ($1<@canon ($2.)>$3);

/* Now we are fairly confident (well, sort of) */
	if ( zero_or_more <@ one_or_more .> zero_or_more )	/* Nope, assume UUCP */
		resolve (mailer (uucp),
				host ($2),
				user ($1$3));
	if ( zero_or_more <@ one_or_more > zero_or_more )	/* It resolved, use tcp */
		resolve (mailer (tcp),
				host ($2),
				user ($1<@$2>$3));

	if ( exactly_one )
		resolve (mailer (local),
				user ($1));

/* everything else must be a local name */

	if ( one_or_more )	/* local names */
		resolve (mailer (local),
				user ($1));

/* ############################################################ */
/* ############################################################ */
/* ##### */
/* #####		Local and Program Mailer specification */
/* ##### */
/* #####		@(#)localm.m4	4.1		7/25/83 */
/* ##### */
/* ############################################################ */
/* ############################################################ */

	}
mailer
	local {
		Path = "/bin/mail",
		Flags = { f_rfrom, f_locm, f_strip, f_date, f_from, f_mesg, f_mult, f_noufrom },
		Sender = RULESET_10,
		Recipient = RULESET_20,
		Argv = "mail -d ${m_ruser}"
	};
mailer
	prog {
		Path = "/bin/sh",
		Flags = { f_locm, f_strip, f_date, f_from, f_mesg, f_expensive },
		Sender = RULESET_10,
		Recipient = RULESET_20,
		Argv = "sh -c ${m_ruser}"
	};

ruleset
	RULESET_10 {
	if (@)	/* errors to mailer-daemon */
		retry ("MAILER"-"DAEMON");

/* ############################################################ */
/* ############################################################ */
/* ##### */
/* #####		UUCP Mailer specification */
/* ##### */
/* #####		@(#)uucpm.m4	4.2		8/30/83 */
/* ##### */
/* ############################################################ */
/* ############################################################ */


/* ##################################################### */
/* #  General code to convert back to old style names  # */
/* ##################################################### */
	}
ruleset
	RULESET_5 {

	if ( one_or_more <@ exactly_one ."UUCP">)	/* u@host.UUCP => host!u */
		retry ($2!$1);
	if ( one_or_more @ one_or_more ."ARPA")	/* u@host.ARPA => u@host */
		retry ($1@$2);

/* the -r flag to smail probably inhibits the phone call ... */
	}
mailer
	uucp {
		Path = "/site/bin/smail",
		Flags = { f_strip, f_date, f_from, f_mesg, f_upperh, f_upperu, f_mult },
		Sender = RULESET_14,
		Recipient = RULESET_24,
		Maxsize = "100000",
				Argv = "smail -vH${m_oname} ${m_rhost}!${m_ruser}"
	};

ruleset
	RULESET_14 {
/* Remove internal uucp syntax marker */
	if ( one_or_more <@ exactly_one ."UUCPS"> zero_or_more )	/* u@h.UUCPS => h!u */
		retry ($2!$1$3);

	if ( zero_or_more <@ any_in_C > zero_or_more )
		return (<@$m_oname:$1@$2>$3);
	if ( zero_or_more <@ any_in_C . one_or_more > zero_or_more )
		return (<@$m_oname:$1@$2.$3>$4);
	if ( zero_or_more <@ one_or_more > zero_or_more )	/* already ok */
		return ($1<@$2>$3);
	if ( one_or_more )	/* tack on our full address */
		return ($1<@$m_oname>);

	}
ruleset
	RULESET_24 {
/* Remove internal uucp syntax marker */
	if ( one_or_more <@ exactly_one ."UUCPS"> zero_or_more )	/* u@h.UUCPS => h!u */
		retry ($2!$1$3);

/* Non domain specified names assume to be on parent domain */
/* #R$*<@$->$*	$@$1<@$2.$D>$3 */

	}
ruleset
	RULESET_13 {
	if ( one_or_more )	/* convert to old style */
		next (RULESET_5 ($1));
	if ( any_in_w ! one_or_more )	/* strip local name */
		retry ($2);
	if ( zero_or_more <@ exactly_one > zero_or_more )	/* resolve abbreviations */
		retry ($1<@$2."ARPA">$3);
	if ( one_or_more )	/* stick on our host name */
		next ("garp"!$1);
	if ( any_in_w ! any_in_R : one_or_more )	/* ucbvax!ucbvax:xxx */
		next ($1!$3);

	}
ruleset
	RULESET_23 {
	if ( one_or_more )	/* convert to old style */
		next (RULESET_5 ($1));
	if ( zero_or_more <@ exactly_one > zero_or_more )	/* resolve abbreviations */
		retry ($1<@$2."ARPA">$3);

/* ############################################################ */
/* ############################################################ */
/* ##### */
/* #####		Ethernet Mailer specification */
/* ##### */
/* #####		@(#)etherm.m4	4.1		7/25/83 */
/* ##### */
/* ############################################################ */
/* ############################################################ */

	}
mailer
	ether {
		Path = "[IPC]",
		Flags = { f_mult, f_strip, f_date, f_from, f_mesg, f_upperu, f_expensive, f_addrw, f_dot },
		Sender = RULESET_11,
		Recipient = RULESET_21,
		Argv = "IPC ${m_rhost}"
	};

ruleset
	RULESET_11 {
	if ( zero_or_more <@ one_or_more > zero_or_more )	/* already ok */
		return ($1<@$2>$3);
	if ( one_or_more )	/* tack on our hostname */
		return ($1<@$m_oname>);

	}
ruleset
	RULESET_21 {

/* ############################################################ */
/* ############################################################ */
/* ##### */
/* #####		Arpanet TCP Mailer specification */
/* ##### */
/* #####		@(#)tcpm.m4	4.1		7/25/83 */
/* ##### */
/* ############################################################ */
/* ############################################################ */

	}
mailer
	tcp {
		Path = "[IPC]",
		Flags = { f_mult, f_strip, f_date, f_from, f_mesg, f_upperu, f_expensive, f_dot, f_llimit },
		Sender = RULESET_27,
		Recipient = RULESET_28,
		Argv = "IPC ${m_rhost}",
		Eol = "\r\n"
	};

ruleset
	RULESET_27 {
/* UUCP --> path@domain */
	if ( zero_or_more <@ exactly_one ."UUCPS"> zero_or_more )
		return ($2!$1<@$m_oname>$3);
/* Local user --> (user@domain) */
	if ( exactly_one )
		return ($1@$m_oname);
/* Non domain specified names assumed to be on our parent domain */
	if ( zero_or_more <@ exactly_one > zero_or_more )
		return ($1<@$2.$D>$3);
/* Domain named machines are unchanged. */
	if ( zero_or_more <@ one_or_more > zero_or_more )
		return ($1<@$2>$3);
/* Give us as the path for any other address. */
	if ( zero_or_more < zero_or_more > zero_or_more )
		retry ($1$2$3);
	if ( one_or_more )
		return (<@$m_oname:$1>);

	}
ruleset
	RULESET_28 {
	if ( one_or_more )	/* Noop rule */
		return ($1);
	}
