xref: /plan9-contrib/sys/src/cmd/upas/send/send.h (revision 3b86f2f88bade1f00206c7aa750b7add255f5724)
1*3b86f2f8SDavid du Colombier /*
2*3b86f2f8SDavid du Colombier  * these limits are intended to stay within those imposed by SMTP
3*3b86f2f8SDavid du Colombier  * and avoid tickling bugs in other mail systems.
4*3b86f2f8SDavid du Colombier  * they both pertain to attempts to group recipients for the same
5*3b86f2f8SDavid du Colombier  * destination together in a single copy of a message.
6*3b86f2f8SDavid du Colombier  */
7*3b86f2f8SDavid du Colombier #define MAXSAME 32	/* max recipients; was 16 */
8*3b86f2f8SDavid du Colombier #define MAXSAMECHAR 1024 /* max chars in the list of recipients */
93e12c5d1SDavid du Colombier 
103e12c5d1SDavid du Colombier /* status of a destination*/
113e12c5d1SDavid du Colombier typedef enum {
123e12c5d1SDavid du Colombier 	d_undefined,	/* address has not been matched*/
133e12c5d1SDavid du Colombier 	d_pipe,		/* repl1|repl2 == delivery command, rep*/
143e12c5d1SDavid du Colombier 	d_cat,		/* repl1 == mail file */
153e12c5d1SDavid du Colombier 	d_translate,	/* repl1 == translation command*/
163e12c5d1SDavid du Colombier 	d_alias,	/* repl1 == translation*/
173e12c5d1SDavid du Colombier 	d_auth,		/* repl1 == command to authorize*/
183e12c5d1SDavid du Colombier 	d_syntax,	/* addr contains illegal characters*/
193e12c5d1SDavid du Colombier 	d_unknown,	/* addr does not match a rewrite rule*/
203e12c5d1SDavid du Colombier 	d_loop,		/* addressing loop*/
213e12c5d1SDavid du Colombier 	d_eloop,	/* external addressing loop*/
223e12c5d1SDavid du Colombier 	d_noforward,	/* forwarding not allowed*/
233e12c5d1SDavid du Colombier 	d_badmbox,	/* mailbox badly formatted*/
243e12c5d1SDavid du Colombier 	d_resource,	/* ran out of something we needed*/
253e12c5d1SDavid du Colombier 	d_pipeto,	/* pipe to from a mailbox*/
263e12c5d1SDavid du Colombier } d_status;
273e12c5d1SDavid du Colombier 
283e12c5d1SDavid du Colombier /* a destination*/
293e12c5d1SDavid du Colombier typedef struct dest dest;
303e12c5d1SDavid du Colombier struct dest {
313e12c5d1SDavid du Colombier 	dest	*next;		/* for chaining*/
323e12c5d1SDavid du Colombier 	dest	*same;		/* dests with same cmd*/
333e12c5d1SDavid du Colombier 	dest	*parent;	/* destination we're a translation of*/
343e12c5d1SDavid du Colombier 	String	*addr;		/* destination address*/
353e12c5d1SDavid du Colombier 	String	*repl1;		/* substitution field 1*/
363e12c5d1SDavid du Colombier 	String	*repl2;		/* substitution field 2*/
373e12c5d1SDavid du Colombier 	int	pstat;		/* process status*/
383e12c5d1SDavid du Colombier 	d_status status;	/* delivery status*/
393e12c5d1SDavid du Colombier 	int	authorized;	/* non-zero if we have been authorized*/
403e12c5d1SDavid du Colombier 	int	nsame;		/* number of same dests chained to this entry*/
413e12c5d1SDavid du Colombier 	int	nchar;		/* number of characters in the command*/
423e12c5d1SDavid du Colombier };
433e12c5d1SDavid du Colombier 
443e12c5d1SDavid du Colombier typedef struct message message;
453e12c5d1SDavid du Colombier struct message {
463e12c5d1SDavid du Colombier 	String	*sender;
473e12c5d1SDavid du Colombier 	String	*replyaddr;
483e12c5d1SDavid du Colombier 	String	*date;
493e12c5d1SDavid du Colombier 	String	*body;
503e12c5d1SDavid du Colombier 	String	*tmp;		/* name of temp file */
517dd7cddfSDavid du Colombier 	String	*to;
523e12c5d1SDavid du Colombier 	int	size;
533e12c5d1SDavid du Colombier 	int	fd;		/* if >= 0, the file the message is stored in*/
547dd7cddfSDavid du Colombier 	char	haveto;
559a747e4fSDavid du Colombier 	String	*havefrom;
569a747e4fSDavid du Colombier 	String	*havesender;
579a747e4fSDavid du Colombier 	String	*havereplyto;
587dd7cddfSDavid du Colombier 	char	havedate;
597dd7cddfSDavid du Colombier 	char	havemime;
609a747e4fSDavid du Colombier 	String	*havesubject;
617dd7cddfSDavid du Colombier 	char	bulk;		/* if Precedence: Bulk in header */
627dd7cddfSDavid du Colombier 	char	rfc822headers;
637dd7cddfSDavid du Colombier 	int	received;	/* number of received lines */
647dd7cddfSDavid du Colombier 	char	*boundary;	/* bondary marker for attachments */
653e12c5d1SDavid du Colombier };
663e12c5d1SDavid du Colombier 
673e12c5d1SDavid du Colombier /*
683e12c5d1SDavid du Colombier  *  exported variables
693e12c5d1SDavid du Colombier  */
703e12c5d1SDavid du Colombier extern int rmail;
713e12c5d1SDavid du Colombier extern int onatty;
72219b2ee8SDavid du Colombier extern char *thissys, *altthissys;
733e12c5d1SDavid du Colombier extern int xflg;
743e12c5d1SDavid du Colombier extern int nflg;
757dd7cddfSDavid du Colombier extern int tflg;
763e12c5d1SDavid du Colombier extern int debug;
777dd7cddfSDavid du Colombier extern int nosummary;
783e12c5d1SDavid du Colombier 
793e12c5d1SDavid du Colombier /*
803e12c5d1SDavid du Colombier  *  exported procedures
813e12c5d1SDavid du Colombier  */
823e12c5d1SDavid du Colombier extern void	authorize(dest*);
839a747e4fSDavid du Colombier extern int	cat_mail(dest*, message*);
843e12c5d1SDavid du Colombier extern dest	*up_bind(dest*, message*, int);
853e12c5d1SDavid du Colombier extern int	ok_to_forward(char*);
863e12c5d1SDavid du Colombier extern int	lookup(char*, char*, Biobuf**, char*, Biobuf**);
873e12c5d1SDavid du Colombier extern dest	*d_new(String*);
883e12c5d1SDavid du Colombier extern void	d_free(dest*);
893e12c5d1SDavid du Colombier extern dest	*d_rm(dest**);
903e12c5d1SDavid du Colombier extern void	d_insert(dest**, dest*);
913e12c5d1SDavid du Colombier extern dest	*d_rm_same(dest**);
923e12c5d1SDavid du Colombier extern void	d_same_insert(dest**, dest*);
937dd7cddfSDavid du Colombier extern String	*d_to(dest*);
943e12c5d1SDavid du Colombier extern dest	*s_to_dest(String*, dest*);
953e12c5d1SDavid du Colombier extern void	gateway(message*);
963e12c5d1SDavid du Colombier extern dest	*expand_local(dest*);
973e12c5d1SDavid du Colombier extern void	logdelivery(dest*, char*, message*);
983e12c5d1SDavid du Colombier extern void	loglist(dest*, message*, char*);
993e12c5d1SDavid du Colombier extern void	logrefusal(dest*, message*, char*);
1007dd7cddfSDavid du Colombier extern int	default_from(message*);
1013e12c5d1SDavid du Colombier extern message	*m_new(void);
1023e12c5d1SDavid du Colombier extern void	m_free(message*);
1037dd7cddfSDavid du Colombier extern message	*m_read(Biobuf*, int, int);
1043e12c5d1SDavid du Colombier extern int	m_get(message*, long, char**);
1053e12c5d1SDavid du Colombier extern int	m_print(message*, Biobuf*, char*, int);
1063e12c5d1SDavid du Colombier extern int	m_bprint(message*, Biobuf*);
107219b2ee8SDavid du Colombier extern String	*rule_parse(String*, char*, int*);
1083e12c5d1SDavid du Colombier extern int	getrules(void);
1097dd7cddfSDavid du Colombier extern int	rewrite(dest*, message*);
1103e12c5d1SDavid du Colombier extern void	dumprules(void);
1113e12c5d1SDavid du Colombier extern void	regerror(char*);
1123e12c5d1SDavid du Colombier extern dest	*translate(dest*);
1137dd7cddfSDavid du Colombier extern char*	skipequiv(char*);
1149a747e4fSDavid du Colombier extern int	refuse(dest*, message*, char*, int, int);
115