Mercurial > notdcc
comparison thrlib/cmn_defs.h @ 0:c7f6b056b673
First import of vendor version
author | Peter Gervai <grin@grin.hu> |
---|---|
date | Tue, 10 Mar 2009 13:49:58 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:c7f6b056b673 |
---|---|
1 /* Distributed Checksum Clearinghouse | |
2 * | |
3 * common threaded client definitions | |
4 * | |
5 * Copyright (c) 2008 by Rhyolite Software, LLC | |
6 * | |
7 * This agreement is not applicable to any entity which sells anti-spam | |
8 * solutions to others or provides an anti-spam solution as part of a | |
9 * security solution sold to other entities, or to a private network | |
10 * which employs the DCC or uses data provided by operation of the DCC | |
11 * but does not provide corresponding data to other users. | |
12 * | |
13 * Permission to use, copy, modify, and distribute this software without | |
14 * changes for any purpose with or without fee is hereby granted, provided | |
15 * that the above copyright notice and this permission notice appear in all | |
16 * copies and any distributed versions or copies are either unchanged | |
17 * or not called anything similar to "DCC" or "Distributed Checksum | |
18 * Clearinghouse". | |
19 * | |
20 * Parties not eligible to receive a license under this agreement can | |
21 * obtain a commercial license to use DCC by contacting Rhyolite Software | |
22 * at sales@rhyolite.com. | |
23 * | |
24 * A commercial license would be for Distributed Checksum and Reputation | |
25 * Clearinghouse software. That software includes additional features. This | |
26 * free license for Distributed ChecksumClearinghouse Software does not in any | |
27 * way grant permision to use Distributed Checksum and Reputation Clearinghouse | |
28 * software | |
29 * | |
30 * THE SOFTWARE IS PROVIDED "AS IS" AND RHYOLITE SOFTWARE, LLC DISCLAIMS ALL | |
31 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES | |
32 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RHYOLITE SOFTWARE, LLC | |
33 * BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES | |
34 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | |
35 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, | |
36 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS | |
37 * SOFTWARE. | |
38 * | |
39 * Rhyolite Software DCC 1.3.103-1.88 $Revision$ | |
40 */ | |
41 | |
42 #ifndef CLNT_DEFS_H | |
43 #define CLNT_DEFS_H | |
44 | |
45 #include "dcc_ck.h" | |
46 #include "dcc_xhdr.h" | |
47 #include "dcc_heap_debug.h" | |
48 #ifdef HAVE_PTHREAD_H | |
49 #include <pthread.h> | |
50 #else | |
51 #include <sys/pthread.h> | |
52 #endif | |
53 #include <sys/un.h> | |
54 #include <sys/resource.h> | |
55 #include <arpa/inet.h> | |
56 #include <signal.h> | |
57 | |
58 | |
59 /* what to do about checksums whose counts say "spam" */ | |
60 typedef enum { | |
61 CMN_REJECT = 0, /* tell sendmail to reject spam */ | |
62 CMN_DISCARD, /* discard spam */ | |
63 CMN_IGNORE /* ignore spam reports */ | |
64 } CMN_ACTION; | |
65 extern CMN_ACTION action; | |
66 | |
67 typedef enum { | |
68 SETHDR, ADDHDR, NOHDR | |
69 } CHGHDR; | |
70 extern CHGHDR chghdr; | |
71 | |
72 | |
73 typedef struct { | |
74 int msgs; /* total messages */ | |
75 int tgts; /* total addressees */ | |
76 int tgts_discarded; /* discarded for this many addressess */ | |
77 int tgts_rejected; | |
78 int tgts_ignored; | |
79 int tgts_embargoed; | |
80 int msgs_embargoed; | |
81 int msgs_spam; | |
82 time_t msg_prev, msg_next; | |
83 } TOTALS; | |
84 extern TOTALS totals; | |
85 | |
86 | |
87 /* This is a wild guess of open files hidden in libraries and elsewhere. | |
88 * Some systems such as Solaris seem to have an amazing number of them | |
89 * Each whitelist context involves an open hash table file */ | |
90 #define EXTRA_FILES (32 + NUM_CWFS) | |
91 | |
92 #define MAX_SELECT_WORK ((FD_SETSIZE-EXTRA_FILES)/FILES_PER_JOB) | |
93 /* dccm and dccifd have differing values for FILES_PER_JOB */ | |
94 #define MIN_MAX_WORK 2 | |
95 extern int max_max_work; | |
96 extern const char *max_max_work_src; | |
97 extern int max_work; | |
98 extern int init_work; | |
99 extern int total_work; | |
100 | |
101 | |
102 typedef struct { | |
103 const char *log_result; /* "reject" etc. for log */ | |
104 const char *rcode; | |
105 const char *xcode; | |
106 const char *str; | |
107 char str_buf[REPLY_BUF_LEN]; | |
108 } REPLY_STRS; | |
109 #define DCC_RCODE "550" | |
110 #define DCC_XCODE "5.7.1" | |
111 extern REPLY_TPLT reject_reply; | |
112 extern REPLY_TPLT grey_reply; | |
113 extern REPLY_TPLT reputation_reply; | |
114 extern REPLY_TPLT dcc_fail_reply; | |
115 extern REPLY_TPLT dnsbl_timeo_reply; | |
116 | |
117 | |
118 /* Some of these flags are computed for all recipients (e.g. white- or | |
119 * blacklisting from the main whiteclnt file) in the common flags and | |
120 * then copied to individual recipient flags words. | |
121 * Others are kept only in the common word. */ | |
122 typedef u_short RCPT_FGS; | |
123 # define RCPT_FG_NULL_WHITECLNT 0x0001 /* no entries in it */ | |
124 # define RCPT_FG_REJ_FILTER 0x0002 /* rejected by dccifd or dccm */ | |
125 # define RCPT_FG_BAD_USERNAME 0x0004 /* user bad & rejected by MTA */ | |
126 # define RCPT_FG_WLIST_ISSPAM 0x0008 /* whiteclnt blacklisted */ | |
127 # define RCPT_FG_WLIST_NOTSPAM 0x0010 /* whiteclnt whitelisted */ | |
128 # define RCPT_FG_WHITE 0x0020 | |
129 # define RCPT_FG_BLACK 0x0040 | |
130 # define RCPT_FG_ISSPAM 0x0080 /* result for this target */ | |
131 # define RCPT_FG_GREY_END 0x0100 /* end of greylist embargo */ | |
132 # define RCPT_FG_GREY_WHITE 0x0200 /* whitelisted for greylist */ | |
133 # define RCPT_FG_INCOMPAT_REJ 0x0400 /* incompatible & so rejected */ | |
134 | |
135 /* per-recipient state */ | |
136 typedef struct rcpt_st { | |
137 struct rcpt_st *fwd; | |
138 struct cmn_work *cwp; | |
139 off_t log_pos_to; /* env_To line in main log file */ | |
140 off_t log_pos_white; | |
141 DCC_CKS_WTGTS wtgts; | |
142 DCC_TGTS env_to_tgts, user_tgts; | |
143 ASK_GREY_RESULT grey_result; | |
144 u_int embargo_num; | |
145 DCC_SUM wf_sum; | |
146 DCC_CKSUM_THOLDS tholds_rej; | |
147 FLTR_SWS sws; | |
148 RCPT_FGS fgs; | |
149 RCPT_FGS global_env_to_fgs; | |
150 RCPT_FGS env_to_fgs; | |
151 # define RCTP_MAXNAME 257 /* sendmail MAXNAME limit */ | |
152 char env_to[RCTP_MAXNAME]; /* env_to */ | |
153 char user[RCTP_MAXNAME]; /* mailbox */ | |
154 char rej_msg[REPLY_BUF_LEN]; | |
155 const char *rej_result; | |
156 DCC_SUM env_to_sum; | |
157 DCC_SUM user_sum; | |
158 DCC_SUM msg_sum; | |
159 DCC_SUM triple_sum; | |
160 DCC_PATH dir; /* recipient's whitelist and logdir */ | |
161 DCC_PATH user_log_nm; | |
162 } RCPT_ST; | |
163 | |
164 | |
165 /* per message state common to threaded DCC clients */ | |
166 typedef struct cmn_work { | |
167 struct work *wp; | |
168 DCC_CLNT_CTXT *dcc_ctxt; | |
169 u_int dcc_ctxt_sn; | |
170 struct timeval ldate; | |
171 CMN_ACTION action; | |
172 u_int xhdr_fname_len; | |
173 char xhdr_fname[sizeof(DCC_XHDR_START)+sizeof(DCC_BRAND)+1]; | |
174 char clnt_name[DCC_MAXDOMAINLEN]; /* SMTP client */ | |
175 char clnt_str[INET6_ADDRSTRLEN+1]; | |
176 struct in6_addr clnt_addr; | |
177 char sender_name[DCC_MAXDOMAINLEN]; /* source of mail message */ | |
178 char sender_str[INET6_ADDRSTRLEN+1]; | |
179 char helo[DCC_HELO_MAX]; | |
180 char env_from[DCC_ENV_FROM_MAX+1]; | |
181 char mail_host[DCC_MAXDOMAINLEN]; /* Mail_From host name */ | |
182 char id[DCC_MSG_ID_LEN+1]; | |
183 DCC_EMSG emsg; | |
184 DCC_PATH tmp_nm; | |
185 DCC_PATH log_nm; /* log file for this message */ | |
186 int num_rcpts; | |
187 # define MAX_RCPTS 1024 | |
188 RCPT_ST *rcpt_st_first, *rcpt_st_last; | |
189 int log_fd; /* -1=none */ | |
190 int tmp_fd; /* copy of entire message */ | |
191 DCC_HEADER_BUF header; | |
192 EARLY_LOG early_log; | |
193 | |
194 u_short cmn_fgs; | |
195 # define CMN_FG_ENV_LOGGED 0x0001 /* have logged the envelope */ | |
196 # define CMN_FG_LOG_EARLY 0x0002 /* too early to write to log file */ | |
197 # define CMN_FG_CHECK_REP 0x0004 /* check DCC reputations */ | |
198 # define CMN_FG_FROM_MX 0x0008 /* don't reject MX secondary */ | |
199 # define CMN_FG_FROM_SUBMIT 0x0010 /* SMTP submission clients */ | |
200 # define CMN_FG_LOCAL_SPAM 0x0020 | |
201 # define CMN_FG_LOG_ENV_TO 0x0040 /* env_to checksum to log */ | |
202 # define CMN_FG_THOLDS_SET 0x0080 | |
203 | |
204 DCC_GOT_CKS cks; | |
205 | |
206 #define CMN_WORK_ZERO log_ip_pos /* here down cleared for each msg */ | |
207 | |
208 off_t log_ip_pos; /* position and length of IP: line */ | |
209 int log_ip_len; | |
210 off_t log_pos_to_first; /* first env_To line in log file */ | |
211 off_t log_pos_to_end; /* end of env_To lines in log file */ | |
212 off_t log_pos_white_first; /* first whitelist result */ | |
213 off_t log_pos_white_last; /* last whitelist result */ | |
214 off_t log_pos_ask_error; /* final DCC errors */ | |
215 u_int max_embargo_num; | |
216 REPLY_STRS reply; | |
217 DCC_TGTS tgts; /* total accepted Mail_From values */ | |
218 DCC_TGTS white_tgts; /* # of ->tgts whitelisting message */ | |
219 DCC_TGTS reject_tgts; /* # of ->tgts rejecting message */ | |
220 DCC_TGTS deliver_tgts; /* # of ->tgts wanting the message */ | |
221 DCC_TGTS mta_rej_tgts; /* not accepted by order of MTA */ | |
222 DCC_TGTS early_grey_tgts; /* report to DCC if embargoed */ | |
223 DCC_TGTS late_grey_tgts; /* don't report to DCC if delivered */ | |
224 DCC_TGTS local_tgts; /* what we told the DCC server */ | |
225 size_t log_size; | |
226 DCC_CKS_WTGTS wtgts; | |
227 FLTR_SWS init_sws; /* initial value for rcpt_st->sws */ | |
228 FLTR_SWS rcpts_sws; /* common among recipients */ | |
229 RCPT_FGS rcpt_fgs; | |
230 ASK_ST ask_st; /* ASK_ST_* */ | |
231 } CMN_WORK; | |
232 | |
233 | |
234 extern u_int dcc_ctxt_sn; /* change X-DCC header server name */ | |
235 | |
236 extern RCPT_ST *rcpt_st_free; | |
237 | |
238 const char *userdirs; | |
239 | |
240 extern u_char dcc_query_only; | |
241 extern u_char cannot_discard; /* cannot trim targets after DATA */ | |
242 extern u_char cannot_reject; /* cannot reject RCPT_TO targets */ | |
243 extern u_char try_extra_hard; /* 0 or DCC_CLNT_FG_NO_FAIL */ | |
244 extern u_char to_white_only; | |
245 extern const char *mapfile_nm; | |
246 extern const char *main_white_nm; | |
247 | |
248 extern pthread_mutex_t user_log_mutex; | |
249 extern pthread_t user_log_owner; | |
250 | |
251 extern void clnt_sigs_off(sigset_t *); | |
252 | |
253 extern void parse_userdirs(const char *); | |
254 extern u_char get_user_dir(RCPT_ST *, const char *, int, const char *, int); | |
255 extern void make_tplt(REPLY_TPLT *, u_char, | |
256 const char *, const char *, const char *, const char *); | |
257 extern void parse_reply_arg(const char *); | |
258 extern void make_reply(REPLY_STRS *, const REPLY_TPLT *, | |
259 const CMN_WORK *, const DNSBL_GROUP *); | |
260 extern void finish_replies(void); | |
261 extern void cmn_init(void); | |
262 extern void cmn_create(CMN_WORK *); | |
263 extern u_char cmn_open_tmp(CMN_WORK *); | |
264 extern void cmn_close_tmp(CMN_WORK *); | |
265 extern u_char cmn_write_tmp(CMN_WORK *cwp, const void *, int); | |
266 extern u_char check_mx_listing(CMN_WORK *); | |
267 extern void cmn_clear(CMN_WORK *, struct work *, u_char); | |
268 extern void free_rcpt_sts(CMN_WORK *, u_char); | |
269 extern RCPT_ST *alloc_rcpt_st(CMN_WORK *, u_char); | |
270 extern void log_start(CMN_WORK *); | |
271 extern void log_stop(CMN_WORK *); | |
272 extern void log_write(CMN_WORK *, const void *, u_int); | |
273 extern void log_body_write(CMN_WORK *, const char *, u_int); | |
274 #define LOG_CMN_CAPTION(cwp, s) log_write(cwp, s, LITZ(s)) | |
275 #define LOG_CMN_EOL(cwp) LOG_CMN_CAPTION(cwp, "\n") | |
276 #define LOG_CAPTION(wp, s) LOG_CMN_CAPTION(&(wp)->cw, s) | |
277 #define LOG_EOL(wp) LOG_CAPTION(wp, "\n") | |
278 extern off_t log_lseek_get(CMN_WORK *); | |
279 extern void thr_log_late(CMN_WORK *); | |
280 extern void thr_log_envelope(CMN_WORK *, u_char); | |
281 extern u_char ck_dcc_ctxt(CMN_WORK *); | |
282 extern u_char cmn_compat_whitelist(CMN_WORK *, RCPT_ST *); | |
283 extern void cmn_ask_white(CMN_WORK *); | |
284 extern int cmn_ask_dcc(CMN_WORK *); | |
285 extern void users_process(CMN_WORK *); | |
286 extern void users_log_result(CMN_WORK *, const char *); | |
287 | |
288 extern void user_reject_discard(CMN_WORK *, RCPT_ST *); | |
289 extern void log_smtp_reply(CMN_WORK *); | |
290 | |
291 extern void totals_init(void); | |
292 extern void totals_stop(void); | |
293 extern void totals_msg(void); | |
294 extern void work_clean(void); | |
295 | |
296 | |
297 #endif /* CLNT_DEFS_H */ |