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