| #define MAXSAME 16 | 
 | #define MAXSAMECHAR 1024 | 
 |  | 
 | /* status of a destination*/ | 
 | typedef enum { | 
 | 	d_undefined,	/* address has not been matched*/ | 
 | 	d_pipe,		/* repl1|repl2 == delivery command, rep*/ | 
 | 	d_cat,		/* repl1 == mail file */ | 
 | 	d_translate,	/* repl1 == translation command*/ | 
 | 	d_alias,	/* repl1 == translation*/ | 
 | 	d_auth,		/* repl1 == command to authorize*/ | 
 | 	d_syntax,	/* addr contains illegal characters*/ | 
 | 	d_unknown,	/* addr does not match a rewrite rule*/ | 
 | 	d_loop,		/* addressing loop*/ | 
 | 	d_eloop,	/* external addressing loop*/ | 
 | 	d_noforward,	/* forwarding not allowed*/ | 
 | 	d_badmbox,	/* mailbox badly formatted*/ | 
 | 	d_resource,	/* ran out of something we needed*/ | 
 | 	d_pipeto,	/* pipe to from a mailbox*/ | 
 | } d_status; | 
 |  | 
 | /* a destination*/ | 
 | typedef struct dest dest; | 
 | struct dest { | 
 | 	dest	*next;		/* for chaining*/ | 
 | 	dest	*same;		/* dests with same cmd*/ | 
 | 	dest	*parent;	/* destination we're a translation of*/ | 
 | 	String	*addr;		/* destination address*/ | 
 | 	String	*repl1;		/* substitution field 1*/ | 
 | 	String	*repl2;		/* substitution field 2*/ | 
 | 	int	pstat;		/* process status*/ | 
 | 	d_status status;	/* delivery status*/ | 
 | 	int	authorized;	/* non-zero if we have been authorized*/ | 
 | 	int	nsame;		/* number of same dests chained to this entry*/ | 
 | 	int	nchar;		/* number of characters in the command*/ | 
 | }; | 
 |  | 
 | typedef struct message message; | 
 | struct message { | 
 | 	String	*sender; | 
 | 	String	*replyaddr; | 
 | 	String	*date; | 
 | 	String	*body; | 
 | 	String	*tmp;		/* name of temp file */ | 
 | 	String	*to; | 
 | 	int	size; | 
 | 	int	fd;		/* if >= 0, the file the message is stored in*/ | 
 | 	char	haveto; | 
 | 	String	*havefrom; | 
 | 	String	*havesender; | 
 | 	String	*havereplyto; | 
 | 	char	havedate; | 
 | 	char	havemime; | 
 | 	String	*havesubject; | 
 | 	char	bulk;		/* if Precedence: Bulk in header */ | 
 | 	char	rfc822headers; | 
 | 	int	received;	/* number of received lines */ | 
 | 	char	*boundary;	/* bondary marker for attachments */ | 
 | }; | 
 |  | 
 | /* | 
 |  *  exported variables | 
 |  */ | 
 | extern int rmail; | 
 | extern int onatty; | 
 | extern char *thissys, *altthissys; | 
 | extern int xflg; | 
 | extern int nflg; | 
 | extern int tflg; | 
 | extern int debug; | 
 | extern int nosummary; | 
 |  | 
 | /* | 
 |  *  exported procedures | 
 |  */ | 
 | extern void	authorize(dest*); | 
 | extern int	cat_mail(dest*, message*); | 
 | extern dest	*up_bind(dest*, message*, int); | 
 | extern int	ok_to_forward(char*); | 
 | extern int	lookup(char*, char*, Biobuf**, char*, Biobuf**); | 
 | extern dest	*d_new(String*); | 
 | extern void	d_free(dest*); | 
 | extern dest	*d_rm(dest**); | 
 | extern void	d_insert(dest**, dest*); | 
 | extern dest	*d_rm_same(dest**); | 
 | extern void	d_same_insert(dest**, dest*); | 
 | extern String	*d_to(dest*); | 
 | extern dest	*s_to_dest(String*, dest*); | 
 | extern void	gateway(message*); | 
 | extern dest	*expand_local(dest*); | 
 | extern void	logdelivery(dest*, char*, message*); | 
 | extern void	loglist(dest*, message*, char*); | 
 | extern void	logrefusal(dest*, message*, char*); | 
 | extern int	default_from(message*); | 
 | extern message	*m_new(void); | 
 | extern void	m_free(message*); | 
 | extern message	*m_read(Biobuf*, int, int); | 
 | extern int	m_get(message*, long, char**); | 
 | extern int	m_print(message*, Biobuf*, char*, int); | 
 | extern int	m_bprint(message*, Biobuf*); | 
 | extern String	*rule_parse(String*, char*, int*); | 
 | extern int	getrules(void); | 
 | extern int	rewrite(dest*, message*); | 
 | extern void	dumprules(void); | 
 | extern void	regerror(char*); | 
 | extern dest	*translate(dest*); | 
 | extern char*	skipequiv(char*); | 
 | extern int	refuse(dest*, message*, char*, int, int); |