2 |
- |
1 |
/*
|
|
|
2 |
* these limits are intended to stay within those imposed by SMTP
|
|
|
3 |
* and avoid tickling bugs in other mail systems.
|
|
|
4 |
* they both pertain to attempts to group recipients for the same
|
|
|
5 |
* destination together in a single copy of a message.
|
|
|
6 |
*/
|
|
|
7 |
#define MAXSAME 32 /* max recipients; was 16 */
|
|
|
8 |
#define MAXSAMECHAR 1024 /* max chars in the list of recipients */
|
|
|
9 |
|
|
|
10 |
/* status of a destination*/
|
|
|
11 |
typedef enum {
|
|
|
12 |
d_undefined, /* address has not been matched*/
|
|
|
13 |
d_pipe, /* repl1|repl2 == delivery command, rep*/
|
|
|
14 |
d_cat, /* repl1 == mail file */
|
|
|
15 |
d_translate, /* repl1 == translation command*/
|
|
|
16 |
d_alias, /* repl1 == translation*/
|
|
|
17 |
d_auth, /* repl1 == command to authorize*/
|
|
|
18 |
d_syntax, /* addr contains illegal characters*/
|
|
|
19 |
d_unknown, /* addr does not match a rewrite rule*/
|
|
|
20 |
d_loop, /* addressing loop*/
|
|
|
21 |
d_eloop, /* external addressing loop*/
|
|
|
22 |
d_noforward, /* forwarding not allowed*/
|
|
|
23 |
d_badmbox, /* mailbox badly formatted*/
|
|
|
24 |
d_resource, /* ran out of something we needed*/
|
|
|
25 |
d_pipeto, /* pipe to from a mailbox*/
|
|
|
26 |
} d_status;
|
|
|
27 |
|
|
|
28 |
/* a destination*/
|
|
|
29 |
typedef struct dest dest;
|
|
|
30 |
struct dest {
|
|
|
31 |
dest *next; /* for chaining*/
|
|
|
32 |
dest *same; /* dests with same cmd*/
|
|
|
33 |
dest *parent; /* destination we're a translation of*/
|
|
|
34 |
String *addr; /* destination address*/
|
|
|
35 |
String *repl1; /* substitution field 1*/
|
|
|
36 |
String *repl2; /* substitution field 2*/
|
|
|
37 |
int pstat; /* process status*/
|
|
|
38 |
d_status status; /* delivery status*/
|
|
|
39 |
int authorized; /* non-zero if we have been authorized*/
|
|
|
40 |
int nsame; /* number of same dests chained to this entry*/
|
|
|
41 |
int nchar; /* number of characters in the command*/
|
|
|
42 |
};
|
|
|
43 |
|
|
|
44 |
typedef struct message message;
|
|
|
45 |
struct message {
|
|
|
46 |
String *sender;
|
|
|
47 |
String *replyaddr;
|
|
|
48 |
String *date;
|
|
|
49 |
String *body;
|
|
|
50 |
String *tmp; /* name of temp file */
|
|
|
51 |
String *to;
|
|
|
52 |
int size;
|
|
|
53 |
int fd; /* if >= 0, the file the message is stored in*/
|
|
|
54 |
char haveto;
|
|
|
55 |
String *havefrom;
|
|
|
56 |
String *havesender;
|
|
|
57 |
String *havereplyto;
|
|
|
58 |
char havedate;
|
|
|
59 |
char havemime;
|
|
|
60 |
String *havesubject;
|
|
|
61 |
char bulk; /* if Precedence: Bulk in header */
|
|
|
62 |
char rfc822headers;
|
|
|
63 |
int received; /* number of received lines */
|
|
|
64 |
char *boundary; /* bondary marker for attachments */
|
|
|
65 |
};
|
|
|
66 |
|
|
|
67 |
/*
|
|
|
68 |
* exported variables
|
|
|
69 |
*/
|
|
|
70 |
extern int rmail;
|
|
|
71 |
extern int onatty;
|
|
|
72 |
extern char *thissys, *altthissys;
|
|
|
73 |
extern int xflg;
|
|
|
74 |
extern int nflg;
|
|
|
75 |
extern int tflg;
|
|
|
76 |
extern int debug;
|
|
|
77 |
extern int nosummary;
|
|
|
78 |
|
|
|
79 |
/*
|
|
|
80 |
* exported procedures
|
|
|
81 |
*/
|
|
|
82 |
extern void authorize(dest*);
|
|
|
83 |
extern int cat_mail(dest*, message*);
|
|
|
84 |
extern dest *up_bind(dest*, message*, int);
|
|
|
85 |
extern int ok_to_forward(char*);
|
|
|
86 |
extern int lookup(char*, char*, Biobuf**, char*, Biobuf**);
|
|
|
87 |
extern dest *d_new(String*);
|
|
|
88 |
extern void d_free(dest*);
|
|
|
89 |
extern dest *d_rm(dest**);
|
|
|
90 |
extern void d_insert(dest**, dest*);
|
|
|
91 |
extern dest *d_rm_same(dest**);
|
|
|
92 |
extern void d_same_insert(dest**, dest*);
|
|
|
93 |
extern String *d_to(dest*);
|
|
|
94 |
extern dest *s_to_dest(String*, dest*);
|
|
|
95 |
extern void gateway(message*);
|
|
|
96 |
extern dest *expand_local(dest*);
|
|
|
97 |
extern void logdelivery(dest*, char*, message*);
|
|
|
98 |
extern void loglist(dest*, message*, char*);
|
|
|
99 |
extern void logrefusal(dest*, message*, char*);
|
|
|
100 |
extern int default_from(message*);
|
|
|
101 |
extern message *m_new(void);
|
|
|
102 |
extern void m_free(message*);
|
|
|
103 |
extern message *m_read(Biobuf*, int, int);
|
|
|
104 |
extern int m_get(message*, long, char**);
|
|
|
105 |
extern int m_print(message*, Biobuf*, char*, int);
|
|
|
106 |
extern int m_bprint(message*, Biobuf*);
|
|
|
107 |
extern String *rule_parse(String*, char*, int*);
|
|
|
108 |
extern int getrules(void);
|
|
|
109 |
extern int rewrite(dest*, message*);
|
|
|
110 |
extern void dumprules(void);
|
|
|
111 |
extern void regerror(char*);
|
|
|
112 |
extern dest *translate(dest*);
|
|
|
113 |
extern char* skipequiv(char*);
|
|
|
114 |
extern int refuse(dest*, message*, char*, int, int);
|