X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/a85c067ba6c6940512cf57ec213277a370d87e70..4687a69c269ee3f2a7f0625e0147a503fd9d3d0b:/src/src/filter.c diff --git a/src/src/filter.c b/src/src/filter.c index 82a9122c6..18567f17c 100644 --- a/src/src/filter.c +++ b/src/src/filter.c @@ -2,10 +2,10 @@ * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) The Exim Maintainers 2020 - 2022 */ +/* Copyright (c) The Exim Maintainers 2020 - 2023 */ /* Copyright (c) University of Cambridge 1995 - 2018 */ /* See the file NOTICE for conditions of use and distribution. */ -/* SPDX-License-Identifier: GPL-2.0-only */ +/* SPDX-License-Identifier: GPL-2.0-or-later */ /* Code for mail filtering functions. */ @@ -194,8 +194,7 @@ static int cond_types[] = { cond_BEGINS, cond_BEGINS, cond_CONTAINS, cond_above, cond_begins, cond_begins, cond_below, cond_contains, cond_contains, cond_ends, cond_ends, cond_is, cond_matches, cond_matches }; -/* Command identities: must be kept in step with the list of command words -and the list of expanded argument counts which follow. */ +/* Command identities */ enum { add_command, defer_command, deliver_command, elif_command, else_command, endif_command, finish_command, fail_command, freeze_command, @@ -203,10 +202,28 @@ enum { add_command, defer_command, deliver_command, elif_command, else_command, mail_command, noerror_command, pipe_command, save_command, seen_command, testprint_command, unseen_command, vacation_command }; -static const char *command_list[] = { - "add", "defer", "deliver", "elif", "else", "endif", "finish", - "fail", "freeze", "headers", "if", "logfile", "logwrite", "mail", - "noerror", "pipe", "save", "seen", "testprint", "unseen", "vacation" +static const char * command_list[] = { + [add_command] = "add", + [defer_command] = "defer", + [deliver_command] = "deliver", + [elif_command] = "elif", + [else_command] = "else", + [endif_command] = "endif", + [finish_command] = "finish", + [fail_command] = "fail", + [freeze_command] = "freeze", + [headers_command] = "headers", + [if_command] = "if", + [logfile_command] = "logfile", + [logwrite_command] = "logwrite", + [mail_command] = "mail", + [noerror_command] = "noerror", + [pipe_command] = "pipe", + [save_command] = "save", + [seen_command] = "seen", + [testprint_command] = "testprint", + [unseen_command] = "unseen", + [vacation_command] = "vacation" }; static int command_list_count = nelem(command_list); @@ -215,27 +232,27 @@ static int command_list_count = nelem(command_list); If the top bit is set, it means that the default for the command is "seen". */ static uschar command_exparg_count[] = { - 2, /* add */ - 1, /* defer */ - 128+2, /* deliver */ - 0, /* elif */ - 0, /* else */ - 0, /* endif */ - 0, /* finish */ - 1, /* fail */ - 1, /* freeze */ - 1, /* headers */ - 0, /* if */ - 1, /* logfile */ - 1, /* logwrite */ - MAILARGS_STRING_COUNT, /* mail */ - 0, /* noerror */ - 128+0, /* pipe */ - 128+1, /* save */ - 0, /* seen */ - 1, /* testprint */ - 0, /* unseen */ - MAILARGS_STRING_COUNT /* vacation */ + [add_command] = 2, + [defer_command] = 1, + [deliver_command] = 128+2, + [elif_command] = 0, + [else_command] = 0, + [endif_command] = 0, + [finish_command] = 0, + [fail_command] = 1, + [freeze_command] = 1, + [headers_command] = 1, + [if_command] = 0, + [logfile_command] = 1, + [logwrite_command] = 1, + [mail_command] = MAILARGS_STRING_COUNT, + [noerror_command] = 0, + [pipe_command] = 128+0, + [save_command] = 128+1, + [seen_command] = 0, + [testprint_command] = 1, + [unseen_command] = 0, + [vacation_command] = MAILARGS_STRING_COUNT }; @@ -259,16 +276,11 @@ nextsigchar(const uschar *ptr, BOOL comment_allowed) for (;;) { while (isspace(*ptr)) - { - if (*ptr == '\n') line_number++; - ptr++; - } + if (*ptr++ == '\n') line_number++; if (comment_allowed && *ptr == '#') - { - while (*(++ptr) != '\n' && *ptr != 0); - continue; - } - else break; + while (*++ptr != '\n' && *ptr) ; + else + break; } return ptr; } @@ -294,18 +306,19 @@ Returns: pointer to the next significant character after the word static const uschar * nextword(const uschar *ptr, uschar *buffer, int size, BOOL bracket) { -uschar *bp = buffer; -while (*ptr != 0 && !isspace(*ptr) && +uschar * bp = buffer; +while (*ptr && !isspace(*ptr) && (!bracket || (*ptr != '(' && *ptr != ')'))) - { - if (bp - buffer < size - 1) *bp++ = *ptr++; else + if (bp - buffer < size - 1) + *bp++ = *ptr++; + else { *error_pointer = string_sprintf("word is too long in line %d of " "filter file (max = %d chars)", line_number, size); break; } - } -*bp = 0; + +*bp = '\0'; return nextsigchar(ptr, TRUE); } @@ -393,8 +406,8 @@ int value, count; if (sscanf(CS s, "%i%n", &value, &count) != 1) return 0; if (tolower(s[count]) == 'k') { value *= 1024; count++; } if (tolower(s[count]) == 'm') { value *= 1024*1024; count++; } -while (isspace((s[count]))) count++; -if (s[count] != 0) return 0; +while (isspace(s[count])) count++; +if (s[count]) return 0; *ok = TRUE; return value; } @@ -671,8 +684,8 @@ for (;;) { // if (toplevel) *saveptr = 0; // else - if (!toplevel) - *error_pointer = string_sprintf("missing \")\" at end of " + if (!toplevel) + *error_pointer = string_sprintf("missing \")\" at end of " "condition near line %d of filter file", line_number); break; } @@ -1463,22 +1476,21 @@ switch (c->type) testing and verification. */ case cond_errormsg: - yield = message_id[0] != 0 && - (sender_address == NULL || sender_address[0] == 0); + yield = message_id[0] && (!sender_address || !*sender_address); break; /* Only FALSE if a message is actually being processed; TRUE for address and filter testing and verification. */ case cond_firsttime: - yield = filter_test != FTEST_NONE || message_id[0] == 0 || f.deliver_firsttime; + yield = filter_test != FTEST_NONE || !message_id[0] || f.deliver_firsttime; break; /* Only TRUE if a message is actually being processed; FALSE for address testing and verification. */ case cond_manualthaw: - yield = message_id[0] != 0 && f.deliver_manual_thaw; + yield = message_id[0] && f.deliver_manual_thaw; break; /* The foranyaddress condition loops through a list of addresses */ @@ -1990,8 +2002,7 @@ while (commands) if (subtype == TRUE) { - while (isspace(*s)) s++; - if (*s) + if (Uskip_whitespace(&s)) { header_add(htype_other, "%s%s", s, s[Ustrlen(s)-1] == '\n' ? "" : "\n"); @@ -2210,7 +2221,7 @@ while (commands) gstring * log_addr = NULL; if (!to) to = expand_string(US"$reply_address"); - while (isspace(*to)) to++; + Uskip_whitespace(&to); for (tt = to; *tt; tt++) /* Get rid of newlines */ if (*tt == '\n') @@ -2282,7 +2293,7 @@ while (commands) /* Move on past this address */ tt = ss + (*ss ? 1 : 0); - while (isspace(*tt)) tt++; + Uskip_whitespace(&tt); } if (log_addr) @@ -2596,3 +2607,5 @@ return yield; /* End of filter.c */ +/* vi: aw ai sw=2 +*/