/*
**
**  Defs.h:  header file for rmail/smail.
**
**  Configuration options for rmail/smail.
**	default configuration is:
**	full domain name is 'hostname.uucp' (get registered!)
**	path file is /usr/lib/uucp/paths.
**	no log, no record, use sendmail.
** 
**  You can change these in the next few blocks.
**
*/

/*
**	@(#)defs.h	2.5 (smail) 9/15/87
*/

#ifndef VERSION
#define	VERSION	"smail2.5"
#endif

/*#define BSD				/* if system is a Berkeley system */

/*#define SENDMAIL "/usr/lib/mail/execmail" /* Turn off to use /bin/(l)mail only */

#ifdef BSD
#define GETHOSTNAME			/* use gethostname() */
#else
#define UNAME 				/* use uname() */
#endif

/* if defined, HOSTNAME overrides UNAME and GETHOSTNAME */
#define HOSTNAME	"crdos1"	/* literal name */

/*#define HOSTDOMAIN	"host.dom"	/* overrides default HOSTNAME.MYDOM */

/*
 * .UUCP here is just for testing, GET REGISTERED in COM, EDU, etc.
 * See INFO.REGISTRY for details.
 */

#define MYDOM		".crd.GE.COM"		/* literal domain suffix */

/*
 * WARNING: DOMGATE is only for qualified gateways - use caution.
 * If you don't fully understand it - don't use it!
 * If you are not completely sure you need it - don't use it!
 * If you are not prepared to handle all addresses to MYDOM - don't use it!
 *
 * if defined, DOMGATE (DOMain GATEway) will cause addresses of the form
 *
 *	user@MYDOM or MYDOM!user
 *
 * (with and without the leading '.' on MYDOM)
 * to be seen treated simply 'user' - a purely local address.
 * Then, it is left to the aliasing code to map it back to a
 * non-local address if necessary.
 */

/*#define DOMGATE		/* Act as Domain Gateway */

/*
 * HIDDENHOSTS allows hosts that serve as domain gateways to hide
 * the subdomains beneath them.  Mail that originates at any of
 * the hosts in the subdomain will appear to come from the gateway host.
 * Hence, mail from
 *
 * 		anything.hostdomain!user
 *
 * will appear to come from 
 *
 * 		hostdomain!user
 *
 * A consequence is that return mail to hostdomain!user would need to
 * be forwarded to the proper subdomain via aliases or other forwarding
 * facilities.
 *
 * If you're using sendmail, then if defined here,
 * it should be used in ruleset 4 of the sendmail.cf, too.
 */

/*#define HIDDENHOSTS			/* hide subdomains of hostdomain */

/*
 * Mail that would otherwise be undeliverable will be passed to the
 * aliased SMARTHOST for potential delivery.
 *
 * Be sure that the host you specify in your pathalias input knows that you're
 * using it as a relay, or you might upset somebody when they find out some
 * other way.  If you're using 'foovax' as your relay, and below you have
 * #define SMARTHOST "smart-host", then the pathalias alias would be:
 *
 *	smart-host = foovax
 */

#define SMARTHOST  "crdgw1"		/* pathalias alias for relay host */

/*
**  ALIAS and CASEALIAS are used only if SENDMAIL is NOT defined.
**  Sites using sendmail have to let sendmail do the aliasing.
**  LOWERLOGNAME maps all local login names into lower case.  This
**  helps sites who have only upper case send mail to mixed case sites.
*/

#define ALIAS	"/usr/lib/mail/aliases"	/* location of mail aliases       */
/*#define CASEALIAS			/* make aliases case sensitive    */
/*#define LOWERLOGNAME			/* map local logins to lower case */

/*
 * defining FULLNAME means that Full Name resolution
 * will be attempted when necessary.
 *
 * the Full Name information will be taken from a
 * list of {Full Name, address} pairs.
 * The names in the list must be sorted
 * without regard to upper/lower case.
 *
 * defining DOT_REQD says that the user name must contain a '.' for
 * the Full Name search to be done.
 *
 * All full name searches are case insensitive.
 *
 */

/*#define FULLNAME	"/usr/lib/fullnames"
					/* list of Full Name, address pairs */

/*#define DOT_REQD			/* Must be George.P.Burdell@gatech.EDU
					** not just  Burdell@gatech.EDU
					*/

/*
**	PATHS is name of pathalias file.  This is mandatory.
**	Define LOG if you want a log of mail.  This can be handy for
**	debugging and traffic analysis.
**	Define RECORD for a copy of all mail.  This uses much time and
**	space and is only used for extreme debugging cases.
*/

#ifndef PATHS
#define PATHS	"/usr/lib/uucp/paths"	/* location of the path database */
#endif

#define LOG	"/usr/spool/uucp/mail.log"	/* log of uucp mail */
/*#define RECORD	"/tmp/mail.log"		/* record of uucp mail */

/*
**  Mailer options:
**	RMAIL is the command to invoke rmail on machine sys.
**	RARG is how to insulate metacharacters from RMAIL. 
**	LMAIL is the command to invoke the local mail transfer agent.
**	LARG is how to insulate metacharacters from LMAIL. 
**	RLARG is LARG with host! on the front - to pass a uux addr to sendmail.
**	SENDMAIL selects one of two sets of defines below for either
**	using sendmail or /bin/lmail.
*/	

#ifndef UUX
#define UUX		"/usr/lib/mail/execmail" /* location of uux command   */
#endif

#ifndef SMAIL
#define SMAIL		"/bin/smail"	/* location of smail command */
#endif

/*
** command used to retry failed mail, flag is used to set the routing level.
*/
#define VFLAG		((debug == VERBOSE)?"-v":"")
#define RETRY(flag)	"%s %s %s -f %s ", SMAIL, VFLAG, flag, spoolfile

/*
** use the -a if you have it.  This sometimes helps failed mail and warning
** messages get back to where the mail originated.
**
** some versions of uux can't do '-a' - pick one of the next two definitions
*/

#if 0
#define RMAIL(flags,from,sys) "%s -a%s %s - %s!rmail",UUX,from,flags,sys /* */
/*#define RMAIL(flags,from,sys) "%s %s - %s!rmail",UUX,flags,sys /* */
#else
#define RMAIL(flags,from,sys) "%s -r %s",UUX,from /* */
#endif

#define RARG(sys,user)		" '%s!%s'",sys,user
#define RFROM(frm,now,host) 	"From %s  %.24s remote from %s\n",frm,now,host

#ifdef SENDMAIL

#define HANDLE	ALL		/* see HANDLE definition below */
#define ROUTING ALL		/* see ROUTING definition below */

#define LMAIL(frm,sys) 	"%s -f %s ",SENDMAIL,frm
#define LARG(user)		" '%s'",postmaster(user)
#define RLARG(sys,frm)		" '%s!%s'",sys,frm

#else

#define HANDLE	ALL
#define ROUTING ALL

#ifdef BSD
#define LMAIL(frm,sys)		"/bin/mail"	/* BSD local delivery agent */
#else
#define LMAIL(frm,sys)		"/bin/lmail"	/* SV  local delivery agent */
#endif

#define LARG(user)		" '%s'",postmaster(user)
#define RLARG(sys,frm)		" '%s!%s'",sys,frm
#define LFROM(frm,now,host)	"From %s %.24s\n",frm,now

#endif

/*
**	The following definitions affect the queueing algorithm for uux.
**
**	DEFQUEUE	if defined the default is to queue uux mail
**
**	QUEUECOST	remote mail with a cost of less than QUEUECOST
**			will be handed to uux for immediate delivery.
**
**	MAXNOQUEUE	don't allow more than 'n' immediate delivery
**			jobs to be started on a single invocation of smail.
**	
**	GETCOST		if defined, the paths file will be searched for
**			each address to discover the cost of the route.
**			this allows informed decisions about whether to
**			use the queue flags when calling uux.  The price
**			is in the overhead of a paths file search for
**			addresses that are not going to be routed.
*/

#define DEFQUEUE			/* default is to queue uux jobs */

#define QUEUECOST		100	/* deliver immediately if the cost
					/* is DEDICATED+LOW or better */

#define MAXNOQUEUE		2	/* max UUX_NOQUEUE jobs         */

#define GETCOST				/* search for cost		*/

#define UUX_QUEUE		"-r"	/* uux flag for queueing	*/
#define UUX_NOQUEUE		""	/* uux with immediate delivery	*/

/*
** Normally, all mail destined for the local host is delivered with a single
** call to the local mailer, and all remote mail is delivered with one call
** to the remote mailer for each remote host.  This kind of 'batching' saves
** on the cpu overhead.
**
** MAXCLEN is used to limit the length of commands that are exec'd by smail.
** This is done to keep other program's buffers from overflowing, or to
** allow for less intelligent commands which can take only one argument
** at a time (e.g., 4.1 /bin/mail).  To disable the batching, set MAXCLEN
** a small value (like 0).
*/

#define MAXCLEN			128	/* longest command allowed (approx.)
					/* this is to keep other's buffers
					** from overflowing
					*/

/*
** PLEASE DON'T TOUCH THE REST
*/

#define SMLBUF	512	/* small buffer (handle one item) */
#define BIGBUF	4096	/* handle lots of items */
 
#define MAXPATH	32	/* number of elements in ! path */
#define MAXDOMS	16	/* number of subdomains in . domain */
#define MAXARGS	500	/* number of arguments */
#ifndef NULL
#define NULL	0
#endif

#define DEBUG 		if (debug==YES) (void) printf
#define ADVISE 		if (debug!=NO) (void) printf
#define error(stat,msg,a)	{ (void) fprintf(stderr, msg, a); exit(stat); }
#define lower(c) 		( isupper(c) ? c-'A'+'a' : c )


enum eform {	/* format of addresses */
	ERROR, 		/* bad or invalidated format */
	LOCAL, 		/* just a local name */
	DOMAIN, 	/* user@domain or domain!user */
	UUCP,		/* host!address */
	ROUTE,		/* intermediate form - to be routed */
	SENT		/* sent to a mailer on a previous pass */
};

enum ehandle { 	/* what addresses can we handle? (don't kick to LMAIL) */
	ALL,		/* UUCP and DOMAIN addresses */
	JUSTUUCP,	/* UUCP only; set by -l  */
	NONE		/* all mail is LOCAL; set by -L */
};

enum erouting {	/* when to route A!B!C!D */
	JUSTDOMAIN,	/* route A if A is a domain */
	ALWAYS,		/* route A always; set by -r */
	REROUTE		/* route C, B, or A (whichever works); set by -R */
};

enum edebug {	/* debug modes */
	NO,		/* normal deliver */
	VERBOSE,	/* talk alot */
	YES		/* talk and don't deliver */
};

#ifdef BSD

#include <strings.h>
#include <sysexits.h>

#else

#include <string.h>
#include "sysexits.h"
#define	index	strchr
#define	rindex	strrchr

#endif
extern void exit(), perror();
extern unsigned sleep();
