123 lines · 3.9 KB · C
RawDownload
/*  * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ /* * these limits are intended to stay within those imposed by SMTP * and avoid tickling bugs in other mail systems. * they both pertain to attempts to group recipients for the same * destination together in a single copy of a message. */#define MAXSAME 32	/* max recipients; was 16 */#define MAXSAMECHAR 1024 /* max chars in the list of recipients */ /* 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);