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