]> git.pld-linux.org Git - packages/dovecot-antispam.git/blame - dovecot-antispam-git.patch
- release 34 (by relup.sh)
[packages/dovecot-antispam.git] / dovecot-antispam-git.patch
CommitLineData
4c03318d
JR
1diff --git a/antispam-plugin.c b/antispam-plugin.c
2index 7756204..76ced7b 100644
3--- a/antispam-plugin.c
4+++ b/antispam-plugin.c
5@@ -90,7 +90,7 @@ static bool mailbox_patternmatch(struct mailbox *box,
6 return FALSE;
7 #endif
8
9- t_push();
10+ T_BEGIN {
11
12 boxname = mailbox_get_name(box);
13 if (lowercase) {
14@@ -110,7 +110,7 @@ static bool mailbox_patternmatch(struct mailbox *box,
15
16 rc = memcmp(name, boxname, len) == 0;
17
18- t_pop();
19+ } T_END;
20
21 return rc;
22 }
23@@ -257,7 +257,7 @@ static int parse_folder_setting(const struct antispam_config *cfg,
24 int cnt = 0;
25 enum match_type i;
26
27- t_push();
28+ T_BEGIN {
29
30 for (i = 0; i < NUM_MT; ++i) {
31 tmp = getenv(t_strconcat(setting, match_info[i].suffix, NULL),
32@@ -286,7 +286,7 @@ static int parse_folder_setting(const struct antispam_config *cfg,
33 }
34 }
35
36- t_pop();
37+ } T_END;
38
39 if (!cnt)
40 debug(&cfg->dbgcfg, "no %s folders\n", display_name);
41@@ -392,4 +392,8 @@ void PLUGIN_FUNCTION(deinit)(void)
42 }
43
44 /* put dovecot version we built against into plugin for checking */
45+#if DOVECOT_IS_GE(2,2)
46+const char *PLUGIN_FUNCTION(version) = DOVECOT_ABI_VERSION;
47+#else
48 const char *PLUGIN_FUNCTION(version) = PACKAGE_VERSION;
49+#endif
33b8a89c 50diff --git a/antispam-plugin.h b/antispam-plugin.h
4c03318d 51index 280bb12..62a3eb3 100644
33b8a89c
JR
52--- a/antispam-plugin.h
53+++ b/antispam-plugin.h
4c03318d
JR
54@@ -10,7 +10,6 @@
55 #include "client.h"
56 #endif
57 #include "ostream.h"
58-#include "dict.h"
59 #include "imap-search.h"
60 #include <stdlib.h>
61
62@@ -43,6 +42,7 @@ struct signature_config {
63 };
64
65 struct antispam_debug_config {
66+ const char *prefix;
67 enum antispam_debug_target target;
68 int verbose;
69 };
33b8a89c
JR
70@@ -98,8 +98,10 @@ struct antispam_config {
71 int extra_env_num;
72 } crm;
73 struct {
74- const char *spam_arg;
75- const char *ham_arg;
76+ char **spam_args;
77+ int spam_args_num;
78+ char **ham_args;
79+ int ham_args_num;
80 const char *pipe_binary;// = "/usr/sbin/sendmail";
81 const char *tmpdir;// = "/tmp";
82 char **extra_args;
4c03318d
JR
83@@ -204,12 +206,6 @@ o_stream_create_from_fd(int fd, pool_t pool)
84 return o_stream_create_file(fd, pool, 0, TRUE);
85 }
86
87-static inline struct dict *
88-string_dict_init(const char *uri, const char *username)
89-{
90- return dict_init(uri, username);
91-}
92-
93 static inline int _mail_get_stream(struct mail *mail,
94 struct message_size *hdr_size,
95 struct message_size *body_size,
96@@ -222,6 +218,11 @@ static inline int _mail_get_stream(struct mail *mail,
97 return 0;
98 }
99 #define mail_get_stream _mail_get_stream
100+
101+#define T_BEGIN \
102+ STMT_START { t_push();
103+#define T_END \
104+ t_pop(); } STMT_END
105 #elif DOVECOT_IS_EQ(1, 1)
106 #define mempool_unref pool_unref
107 #define module_arg void
108@@ -231,7 +232,7 @@ static inline const char *const *
109 get_mail_headers(struct mail *mail, const char *hdr)
110 {
111 const char *const *ret;
112- if (mail_get_headers(mail, hdr, &ret))
113+ if (mail_get_headers(mail, hdr, &ret) < 0)
114 return NULL;
115 return ret;
116 }
117@@ -250,7 +251,7 @@ static inline const char *const *
118 get_mail_headers(struct mail *mail, const char *hdr)
119 {
120 const char *const *ret;
121- if (mail_get_headers(mail, hdr, &ret))
122+ if (mail_get_headers(mail, hdr, &ret) < 0)
123 return NULL;
124 return ret;
125 }
126@@ -260,7 +261,7 @@ o_stream_create_from_fd(int fd, pool_t pool ATTR_UNUSED)
33b8a89c
JR
127 {
128 return o_stream_create_fd(fd, 0, TRUE);
129 }
130-#elif DOVECOT_IS_EQ(2, 0)
4c03318d 131+#elif DOVECOT_IS_EQ(2, 0) || DOVECOT_IS_EQ(2, 1) || DOVECOT_IS_EQ(2, 2)
33b8a89c
JR
132 #define mempool_unref pool_unref
133 #define module_arg struct module *
134 #define ME(err) MAIL_ERROR_ ##err,
4c03318d
JR
135@@ -269,7 +270,7 @@ static inline const char *const *
136 get_mail_headers(struct mail *mail, const char *hdr)
137 {
138 const char *const *ret;
139- if (mail_get_headers(mail, hdr, &ret))
140+ if (mail_get_headers(mail, hdr, &ret) < 0)
141 return NULL;
142 return ret;
143 }
144@@ -279,12 +280,6 @@ o_stream_create_from_fd(int fd, pool_t pool ATTR_UNUSED)
145 {
146 return o_stream_create_fd(fd, 0, TRUE);
147 }
148-
149-static inline struct dict *
150-string_dict_init(const char *uri, const char *username)
151-{
152- return dict_init(uri, DICT_DATA_TYPE_STRING, username, NULL);
153-}
154 #else
155 #error "Building against this dovecot version is not supported"
156 #endif
157diff --git a/antispam-storage-1.1.c b/antispam-storage-1.1.c
158index f28a0cf..aab23d9 100644
159--- a/antispam-storage-1.1.c
160+++ b/antispam-storage-1.1.c
161@@ -508,10 +508,10 @@ void antispam_mail_storage_created(struct mail_storage *storage)
162
163 static const char *_getenv(const char *env, void *data ATTR_UNUSED)
164 {
165- t_push();
166+ T_BEGIN {
167 env = t_str_ucase(t_strconcat("antispam_", env, NULL));
168 env = getenv(env);
169- t_pop();
170+ } T_END;
171
172 return env;
173 }
174diff --git a/antispam-storage-1.2.c b/antispam-storage-1.2.c
175index 5e0cb97..269a373 100644
176--- a/antispam-storage-1.2.c
177+++ b/antispam-storage-1.2.c
178@@ -498,10 +498,10 @@ void antispam_mail_storage_created(struct mail_storage *storage)
179
180 static const char *_getenv(const char *env, void *data ATTR_UNUSED)
181 {
182- t_push();
183+ T_BEGIN {
184 env = t_str_ucase(t_strconcat("antispam_", env, NULL));
185 env = getenv(env);
186- t_pop();
187+ } T_END;
188
189 return env;
190 }
33b8a89c 191diff --git a/antispam-storage-2.0.c b/antispam-storage-2.0.c
4c03318d 192index 5a089bc..c3d6251 100644
33b8a89c
JR
193--- a/antispam-storage-2.0.c
194+++ b/antispam-storage-2.0.c
195@@ -472,7 +472,7 @@ static void antispam_mailbox_allocated(struct mailbox *box)
196
197 asbox->save_hack = FALSE;
198 asbox->movetype = MMT_APPEND;
199- asbox->cfg = asuser->cfg;
200+ asbox->cfg = asuser->cfg;
201
202 v->free = antispam_mailbox_free;
203
4c03318d
JR
204@@ -494,11 +494,11 @@ static const char *_getenv(const char *name, void *data)
205 struct mail_user *user = data;
206 const char *env;
207
208- t_push();
209+ T_BEGIN {
210 env = t_strconcat("antispam_", t_str_lcase(name), NULL);
211
212 env = mail_user_plugin_getenv(user, env);
213- t_pop();
214+ } T_END;
215
216 return env;
217 }
33b8a89c 218diff --git a/antispam.7 b/antispam.7
4c03318d 219index 5e33e4c..497da58 100644
33b8a89c
JR
220--- a/antispam.7
221+++ b/antispam.7
222@@ -1,4 +1,4 @@
223-.TH ANTISPAM 7 "15 October 2007" "" ""
224+.TH ANTISPAM 7 "24 March 2012" "" ""
225 .SH NAME
226 antispam \- The dovecot antispam plugin.
227
4c03318d
JR
228@@ -120,6 +120,9 @@ plugin {
229 # antispam_debug_target = syslog
230 # antispam_debug_target = stderr
231 # antispam_verbose_debug = 1
232+ #
233+ # This can be used to get a prefix, e.g. by specifying %u in it
234+ # antispam_debug_prefix = "antispam: "
235
236 # backend selection, MUST be configured first,
237 # there's no default so you need to set one of
238@@ -206,6 +209,11 @@ plugin {
33b8a89c
JR
239 # semicolon-separated list of blacklisted results, case insensitive
240 # antispam_dspam_result_blacklist = Virus
241
242+ # semicolon-separated list of environment variables to set
243+ # (default unset i.e. none)
244+ # antispam_dspam_env =
245+ # antispam_dspam_env = HOME=%h;USER=%u
246+
247 #=====================
248 # pipe plugin
249 #
4c03318d 250@@ -228,6 +236,14 @@ plugin {
33b8a89c
JR
251 # "mailtrain" are still valid, these are, in the same order as
252 # above: antispam_mail_sendmail, antispam_mail_sendmail_args,
253 # antispam_mail_spam, antispam_mail_notspam and antispam_mail_tmpdir.
254+ #
255+ # Alternatively, if you need to give multiple options, you can use
256+ # the spam_args/notspam_args parameters (which are used in preference
257+ # of the singular form):
258+ # antispam_pipe_program_spam_args = --spam;--my-other-param1
259+ # antispam_pipe_program_notspam_args = --ham;--my-other-param2
260+ # which will then call
261+ # /path/to/mailtrain --for jberg --spam --my-other-param1
262
263 # temporary directory
264 antispam_pipe_tmpdir = /tmp
4c03318d 265@@ -247,7 +263,7 @@ plugin {
33b8a89c
JR
266 antispam_crm_binary = /bin/false
267 # antispam_crm_binary = /usr/share/crm114/mailreaver.crm
268
269- # semicolon-separated list of extra arguments to dspam
270+ # semicolon-separated list of extra arguments to crm114
271 # (default unset i.e. none)
272 # antispam_crm_args =
273 # antispam_crm_args = --config=/path/to/config
4c03318d 274@@ -257,11 +273,6 @@ plugin {
33b8a89c
JR
275 # antispam_crm_env =
276 # antispam_crm_env = HOME=%h;USER=%u
277
278- # semicolon-separated list of environment variables to set
279- # (default unset i.e. none)
280- # antispam_dspam_env =
281- # antispam_dspam_env = HOME=%h;USER=%u
282-
283 # NOTE: you need to set the signature for this backend
284 antispam_signature = X-CRM114-CacheID
285
4c03318d
JR
286diff --git a/crm114-exec.c b/crm114-exec.c
287index 5b39ca9..d786e04 100644
288--- a/crm114-exec.c
289+++ b/crm114-exec.c
290@@ -113,7 +113,7 @@ static int call_reaver(const struct antispam_config *cfg,
291
292 debugv(&cfg->dbgcfg, argv);
293
294- t_push();
295+ T_BEGIN {
296 for (i = 0; i < cfg->crm.extra_env_num; i++) {
297 char *name, *value;
298 name = t_strdup_noconst(cfg->crm.extra_env[i]);
299@@ -124,7 +124,7 @@ static int call_reaver(const struct antispam_config *cfg,
300 }
301 setenv(name, value, 1);
302 }
303- t_pop();
304+ } T_END;
305
306 execv(cfg->crm.reaver_binary, argv);
307 /* fall through if reaver can't be found */
308diff --git a/debug.c b/debug.c
309index d2683fa..77f0167 100644
310--- a/debug.c
311+++ b/debug.c
312@@ -1,4 +1,3 @@
313-#define _BSD_SOURCE
314 #include <syslog.h>
315 #include <stdarg.h>
316 #include <stdio.h>
317@@ -14,9 +13,9 @@ static void _debug(const struct antispam_debug_config *cfg,
318 if (cfg->target == ADT_NONE)
319 return;
320
321- t_push();
322+ T_BEGIN {
323
324- fmt = t_strconcat("antispam: ", format, NULL);
325+ fmt = t_strconcat(cfg->prefix, format, NULL);
326
327 switch (cfg->target) {
328 case ADT_NONE:
329@@ -30,7 +29,7 @@ static void _debug(const struct antispam_debug_config *cfg,
330 break;
331 }
332
333- t_pop();
334+ } T_END;
335 }
336
337 void debug(const struct antispam_debug_config *cfg, const char *fmt, ...)
338@@ -48,7 +47,7 @@ void debugv(const struct antispam_debug_config *cfg, char **args)
339 char *buf;
340 const char *str;
341
342- t_push();
343+ T_BEGIN {
344 buf = t_buffer_get(buflen);
345
346 while (1) {
347@@ -72,7 +71,7 @@ void debugv(const struct antispam_debug_config *cfg, char **args)
348 t_buffer_alloc(pos);
349
350 debug(cfg, "%s", buf);
351- t_pop();
352+ } T_END;
353 }
354
355 void debugv_not_stderr(const struct antispam_debug_config *cfg, char **args)
356@@ -111,6 +110,10 @@ int debug_init(struct antispam_debug_config *cfg,
357 return -1;
358 }
359
360+ cfg->prefix = getenv("DEBUG_PREFIX", getenv_data);
361+ if (!cfg->prefix)
362+ cfg->prefix = "antispam: ";
363+
364 debug(cfg, "plugin initialising (%s)\n", ANTISPAM_VERSION);
365
366 tmp = getenv("VERBOSE_DEBUG", getenv_data);
33b8a89c 367diff --git a/dovecot-version.c b/dovecot-version.c
4c03318d 368index cbcb35b..fe9bc73 100644
33b8a89c
JR
369--- a/dovecot-version.c
370+++ b/dovecot-version.c
4c03318d
JR
371@@ -1,6 +1,7 @@
372 #include <stdio.h>
373 #include <string.h>
374 #include <stdlib.h>
375+#include <ctype.h>
376 #include "config.h"
377
378 int main(int argc, char **argv)
379@@ -17,21 +18,24 @@ int main(int argc, char **argv)
33b8a89c
JR
380
381 maj = strtol(v, &e, 10);
382 if (v == e)
383- return 1;
384+ return 2;
385
386 v = e + 1;
387
388 min = strtol(v, &e, 10);
389 if (v == e)
390- return 1;
391+ return 3;
392
393 /* not end of string yet? */
394 if (*e) {
395 v = e + 1;
396
397- patch = strtol(v, &e, 10);
398- if (v == e)
399- return 1;
400+ if (isdigit(*v)) {
401+ patch = strtol(v, &e, 10);
402+ if (v == e)
403+ return 4;
404+ } else
4c03318d 405+ patch = 0;
33b8a89c
JR
406 }
407
408 printf("/* Auto-generated file, do not edit */\n\n");
4c03318d
JR
409@@ -40,6 +44,8 @@ int main(int argc, char **argv)
410
411 printf("#define DOVECOT_VCODE "
412 "0x%.2x%.2x%.2x\n", maj, min, 0);
413+ printf("#define DOVECOT_VCODE_PATCH "
414+ "0x%.2x%.2x%.2x\n", maj, min, patch);
415 printf("#define DOVECOT_IS_EQ(maj, min) "
416 "DOVECOT_VCODE == DOVECOT_VERSION_CODE(maj, min, 0)\n");
417 printf("#define DOVECOT_IS_GT(maj, min) "
418@@ -50,6 +56,22 @@ int main(int argc, char **argv)
33b8a89c
JR
419 "DOVECOT_VCODE < DOVECOT_VERSION_CODE(maj, min, 0)\n");
420 printf("#define DOVECOT_IS_LE(maj, min) "
421 "DOVECOT_VCODE <= DOVECOT_VERSION_CODE(maj, min, 0)\n");
422+
4c03318d
JR
423+ printf("#define DOVECOT_P_IS_EQ(maj, min, patch) "
424+ "DOVECOT_VCODE_PATCH == DOVECOT_VERSION_CODE(maj, min, patch)\n");
425+ printf("#define DOVECOT_P_IS_GT(maj, min, patch) "
426+ "DOVECOT_VCODE_PATCH > DOVECOT_VERSION_CODE(maj, min, patch)\n");
427+ printf("#define DOVECOT_P_IS_GE(maj, min, patch) "
428+ "DOVECOT_VCODE_PATCH >= DOVECOT_VERSION_CODE(maj, min, patch)\n");
429+ printf("#define DOVECOT_P_IS_LT(maj, min, patch) "
430+ "DOVECOT_VCODE_PATCH < DOVECOT_VERSION_CODE(maj, min, patch)\n");
431+ printf("#define DOVECOT_P_IS_LE(maj, min, patch) "
432+ "DOVECOT_VCODE_PATCH <= DOVECOT_VERSION_CODE(maj, min, patch)\n");
433+
434+ /* Use the antispam-storage-2.0.c for dovecot 2.1 and 2.2 as well */
435+ if (maj == 2 && min < 3)
33b8a89c
JR
436+ min = 0;
437+
438 printf("#define ANTISPAM_STORAGE "
439 "\"antispam-storage-%d.%d.c\"\n", maj, min);
440
4c03318d
JR
441diff --git a/dspam-exec.c b/dspam-exec.c
442index 2e353ce..856babb 100644
443--- a/dspam-exec.c
444+++ b/dspam-exec.c
445@@ -141,7 +141,7 @@ static int call_dspam(const struct antispam_config *cfg,
446 */
447 debugv_not_stderr(&cfg->dbgcfg, argv);
448
449- t_push();
450+ T_BEGIN {
451 for (i = 0; i < cfg->dspam.extra_env_num; i++) {
452 char *name, *value;
453 name = t_strdup_noconst(cfg->dspam.extra_env[i]);
454@@ -152,7 +152,7 @@ static int call_dspam(const struct antispam_config *cfg,
455 }
456 setenv(name, value, 1);
457 }
458- t_pop();
459+ } T_END;
460
461 execv(cfg->dspam.binary, argv);
462 debug(&cfg->dbgcfg, "executing %s failed: %d (uid=%d, gid=%d)",
33b8a89c 463diff --git a/pipe.c b/pipe.c
4c03318d 464index 18c2233..f9abef5 100644
33b8a89c
JR
465--- a/pipe.c
466+++ b/pipe.c
467@@ -34,16 +34,19 @@
468 static int run_pipe(const struct antispam_config *cfg,
469 int mailfd, enum classification wanted)
470 {
471- const char *dest;
472+ char **dest;
473+ int dest_num;
474 pid_t pid;
475 int status;
476
477 switch (wanted) {
478 case CLASS_SPAM:
479- dest = cfg->pipe.spam_arg;
480+ dest = cfg->pipe.spam_args;
481+ dest_num = cfg->pipe.spam_args_num;
482 break;
483 case CLASS_NOTSPAM:
484- dest = cfg->pipe.ham_arg;
485+ dest = cfg->pipe.ham_args;
4c03318d 486+ dest_num = cfg->pipe.ham_args_num;
33b8a89c
JR
487 break;
488 }
489
490@@ -65,18 +68,23 @@ static int run_pipe(const struct antispam_config *cfg,
491 return WEXITSTATUS(status);
492 } else {
493 char **argv;
494- int sz = sizeof(char *) * (2 + cfg->pipe.extra_args_num + 1);
495- int i, fd;
496+ int sz = sizeof(char *) * (2 + cfg->pipe.extra_args_num + dest_num + 1);
497+ int i, j, fd;
498
499 argv = i_malloc(sz);
500 memset(argv, 0, sz);
501
502 argv[0] = (char *) cfg->pipe.pipe_binary;
503
504- for (i = 0; i < cfg->pipe.extra_args_num; i++)
505+ for (i = 0; i < cfg->pipe.extra_args_num; i++) {
506 argv[i + 1] = (char *) cfg->pipe.extra_args[i];
507+ debug(&cfg->dbgcfg, "running mailtrain backend program parameter %d %s", i + 1, argv[i + 1]);
508+ }
509
510- argv[i + 1] = (char *) dest;
511+ for (j = 0; j < dest_num; j++) {
512+ argv[i + 1 + j] = (char *) dest[j];
513+ debug(&cfg->dbgcfg, "running mailtrain backend program parameter %d %s", i + 1 + j, argv[i + 1 + j]);
514+ }
515
516 dup2(mailfd, 0);
517 fd = open("/dev/null", O_WRONLY);
4c03318d
JR
518@@ -128,7 +136,7 @@ static int process_tmpdir(const struct antispam_config *cfg,
519 enum classification wanted;
520 int rc = 0;
521
522- t_push();
523+ T_BEGIN {
524
525 buf = t_malloc(20 + ast->tmplen);
526
527@@ -151,7 +159,7 @@ static int process_tmpdir(const struct antispam_config *cfg,
528 close(fd);
529 }
530
531- t_pop();
532+ } T_END;
533
534 return rc;
535 }
536@@ -160,7 +168,7 @@ static void clear_tmpdir(struct antispam_transaction_context *ast)
537 {
538 char *buf;
539
540- t_push();
541+ T_BEGIN {
542
543 buf = t_malloc(20 + ast->tmplen);
544
545@@ -172,7 +180,7 @@ static void clear_tmpdir(struct antispam_transaction_context *ast)
546 }
547 rmdir(ast->tmpdir);
548
549- t_pop();
550+ } T_END;
551 }
552
553 static void backend_rollback(const struct antispam_config *cfg ATTR_UNUSED,
33b8a89c
JR
554@@ -228,7 +236,7 @@ static int backend_handle_mail(const struct antispam_config *cfg,
555 return -1;
556 }
557
558- if (!cfg->pipe.ham_arg || !cfg->pipe.spam_arg) {
559+ if (!cfg->pipe.ham_args || !cfg->pipe.spam_args) {
560 mail_storage_set_error(t->box->storage,
561 ME(NOTPOSSIBLE)
562 "antispam plugin not configured");
4c03318d
JR
563@@ -242,7 +250,7 @@ static int backend_handle_mail(const struct antispam_config *cfg,
564 return -1;
565 }
566
567- t_push();
568+ T_BEGIN {
569
570 buf = t_malloc(20 + ast->tmplen);
571 i_snprintf(buf, 20 + ast->tmplen - 1, "%s/%d", ast->tmpdir, ast->count);
572@@ -303,8 +311,8 @@ static int backend_handle_mail(const struct antispam_config *cfg,
573 o_stream_destroy(&outstream);
574 out_close:
575 close(fd);
576- out:
577- t_pop();
578+ out: ;
579+ } T_END;
580
581 return ret;
582 }
33b8a89c
JR
583@@ -316,20 +324,50 @@ static void backend_init(struct antispam_config *cfg,
584 const char *tmp;
585 int i;
586
587- tmp = getenv("PIPE_PROGRAM_SPAM_ARG", getenv_data);
588- if (!tmp)
589- tmp = getenv("MAIL_SPAM", getenv_data);
590+ tmp = getenv("PIPE_PROGRAM_SPAM_ARGS", getenv_data);
591 if (tmp) {
592- cfg->pipe.spam_arg = tmp;
593- debug(&cfg->dbgcfg, "pipe backend spam argument = %s\n", tmp);
594+ cfg->pipe.spam_args = p_strsplit(cfg->mem_pool, tmp, ";");
595+ cfg->pipe.spam_args_num = str_array_length(
596+ (const char *const *)cfg->pipe.spam_args);
597+ for (i = 0; i < cfg->pipe.spam_args_num; i++)
598+ debug(&cfg->dbgcfg, "pipe backend spam arg[%d] = %s\n",
599+ i, cfg->pipe.spam_args[i]);
600+ } else {
601+ tmp = getenv("PIPE_PROGRAM_SPAM_ARG", getenv_data);
602+ if (!tmp)
603+ tmp = getenv("MAIL_SPAM", getenv_data);
604+ if (tmp) {
605+ /* bit of a hack */
606+ cfg->pipe.spam_args =
607+ p_strsplit(cfg->mem_pool, tmp, "\x01");
608+ cfg->pipe.spam_args_num = 1;
609+ debug(&cfg->dbgcfg,
610+ "pipe backend spam argument = %s\n", tmp);
611+ tmp = NULL;
612+ }
613 }
614
615- tmp = getenv("PIPE_PROGRAM_NOTSPAM_ARG", getenv_data);
616- if (!tmp)
617- tmp = getenv("MAIL_NOTSPAM", getenv_data);
618+ tmp = getenv("PIPE_PROGRAM_NOTSPAM_ARGS", getenv_data);
619 if (tmp) {
620- cfg->pipe.ham_arg = tmp;
621- debug(&cfg->dbgcfg, "pipe backend not-spam argument = %s\n", tmp);
622+ cfg->pipe.ham_args = p_strsplit(cfg->mem_pool, tmp, ";");
623+ cfg->pipe.ham_args_num = str_array_length(
624+ (const char *const *)cfg->pipe.ham_args);
625+ for (i = 0; i < cfg->pipe.ham_args_num; i++)
626+ debug(&cfg->dbgcfg, "pipe backend ham arg[%d] = %s\n",
627+ i, cfg->pipe.ham_args[i]);
628+ } else {
629+ tmp = getenv("PIPE_PROGRAM_NOTSPAM_ARG", getenv_data);
630+ if (!tmp)
631+ tmp = getenv("MAIL_NOTSPAM", getenv_data);
632+ if (tmp) {
633+ /* bit of a hack */
634+ cfg->pipe.ham_args =
635+ p_strsplit(cfg->mem_pool, tmp, "\x01");
636+ cfg->pipe.ham_args_num = 1;
637+ debug(&cfg->dbgcfg,
638+ "pipe backend not-spam argument = %s\n", tmp);
639+ tmp = NULL;
640+ }
641 }
642
643 tmp = getenv("PIPE_PROGRAM", getenv_data);
4c03318d
JR
644diff --git a/spool2dir.c b/spool2dir.c
645index cbd1909..d304716 100644
646--- a/spool2dir.c
647+++ b/spool2dir.c
648@@ -165,7 +165,7 @@ static int backend_handle_mail(const struct antispam_config *cfg,
649 return -1;
650 }
651
652- t_push();
653+ T_BEGIN {
654
655 /* atomically create a _new_ file */
656 while (ast->count <= 9999) {
657@@ -174,9 +174,6 @@ static int backend_handle_mail(const struct antispam_config *cfg,
658 if (fd >= 0 || errno != EEXIST)
659 break;
660 /* current filename in buf already exists, zap it */
661- t_pop();
662- t_push();
663- /* buf is invalid now! */
664 }
665
666 if (fd < 0) {
667@@ -225,8 +222,8 @@ static int backend_handle_mail(const struct antispam_config *cfg,
668 close(fd);
669 if (ret)
670 unlink(buf);
671- out:
672- t_pop();
673+ out: ;
674+ } T_END;
675
676 return ret;
677 }
This page took 0.136273 seconds and 4 git commands to generate.