X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/18eacc1185bea956bd9c793ab34e582c08941799..HEAD:/src/src/filtertest.c diff --git a/src/src/filtertest.c b/src/src/filtertest.c index 2426f7feb..35d939ee0 100644 --- a/src/src/filtertest.c +++ b/src/src/filtertest.c @@ -2,7 +2,7 @@ * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) The Exim Maintainers 2021 - 2022 */ +/* Copyright (c) The Exim Maintainers 2021 - 2024 */ /* Copyright (c) University of Cambridge 1995 - 2009 */ /* See the file NOTICE for conditions of use and distribution. */ /* SPDX-License-Identifier: GPL-2.0-or-later */ @@ -101,7 +101,6 @@ if (!dot_ended && !stdin_feof()) } if (s == message_body_end || s[-1] != '\n') body_linecount++; } -debug_printf("%s %d\n", __FUNCTION__, __LINE__); message_body[body_len] = 0; message_body_size = message_size - header_size; @@ -144,6 +143,30 @@ while (body_end_len > 0) +static int +exim_filter_interpret(const uschar * filebuf, int options, + address_item ** addrp, uschar ** error) +{ +#ifdef DISABLE_EXIM_FILTER + printf("exim: Exim-filtering not available\n"); + return FF_ERROR; +#else + +const misc_module_info * mi; +uschar * errstr = NULL; +typedef int (*fn_t)(const uschar *, int, address_item **, uschar **); +if (!(mi = misc_mod_find(US"exim_filter", &errstr))) + { + printf("exim: Exim-filtering not available: %s\n", errstr ? errstr : US"?"); + return FF_ERROR; + } +return(((fn_t *) mi->functions)[EXIM_INTERPRET]) + (filebuf, options, addrp, error); +#endif +} + + + /************************************************* * Test a mail filter * *************************************************/ @@ -164,7 +187,7 @@ Returns: TRUE if no errors */ BOOL -filter_runtest(int fd, uschar *filename, BOOL is_system, BOOL dot_ended) +filter_runtest(int fd, const uschar * filename, BOOL is_system, BOOL dot_ended) { int rc, filter_type; BOOL yield; @@ -202,8 +225,8 @@ filter_type = rda_is_filter(filebuf); if (is_system && filter_type == FILTER_FORWARD) filter_type = FILTER_EXIM; printf("Testing %s file \"%s\"\n\n", - (filter_type == FILTER_EXIM)? "Exim filter" : - (filter_type == FILTER_SIEVE)? "Sieve filter" : + filter_type == FILTER_EXIM ? "Exim filter" : + filter_type == FILTER_SIEVE ? "Sieve filter" : "forward file", filename); @@ -234,13 +257,13 @@ if (filter_type == FILTER_FORWARD) return FALSE; } - if (generated == NULL) + if (!generated) printf("exim: no addresses generated from forward file\n"); else { printf("exim: forward file generated:\n"); - while (generated != NULL) + while (generated) { printf(" %s\n", generated->address); generated = generated->next; @@ -264,18 +287,28 @@ if (is_system) { f.system_filtering = TRUE; f.enable_dollar_recipients = TRUE; /* Permit $recipients in system filter */ - yield = filter_interpret - (filebuf, - RDO_DEFER|RDO_FAIL|RDO_FILTER|RDO_FREEZE|RDO_REWRITE, &generated, &error); + yield = exim_filter_interpret(filebuf, + RDO_DEFER|RDO_FAIL|RDO_FILTER|RDO_FREEZE|RDO_REWRITE, &generated, &error); f.enable_dollar_recipients = FALSE; f.system_filtering = FALSE; } -else +else if (filter_type == FILTER_SIEVE) { - yield = filter_type == FILTER_SIEVE - ? sieve_interpret(filebuf, RDO_REWRITE, NULL, NULL, NULL, NULL, &generated, &error) - : filter_interpret(filebuf, RDO_REWRITE, &generated, &error); + const misc_module_info * mi; + uschar * errstr = NULL; + typedef int (*fn_t)(const uschar *, int, const sieve_block *, + address_item **, uschar **); + if (!(mi = misc_mod_find(US"sieve_filter", &errstr))) + { + printf("exim: Sieve filtering not available: %s\n", errstr ? errstr : US"?"); + yield = FF_ERROR; + } + else + yield = (((fn_t *) mi->functions)[SIEVE_INTERPRET]) + (filebuf, RDO_REWRITE, NULL, &generated, &error); } +else + yield = exim_filter_interpret(filebuf, RDO_REWRITE, &generated, &error); return yield != FF_ERROR; }