/*
* 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);
|