X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/d5c0d8c9374623620844d539d4810da63e9abca1..049782c0de52a217f78116f82b3a1d69c0667458:/src/src/header.c diff --git a/src/src/header.c b/src/src/header.c index decd0cce6..19dbcc15d 100644 --- a/src/src/header.c +++ b/src/src/header.c @@ -86,10 +86,10 @@ Arguments: format sprintf format ap va_list value for format arguments -Returns: nothing +Returns: pointer to header struct (last one, if multiple added) */ -static void +static header_line * header_add_backend(BOOL after, uschar *name, BOOL topnot, int type, const char *format, va_list ap) { @@ -98,16 +98,18 @@ header_line **hptr; uschar *p, *q; uschar buffer[HEADER_ADD_BUFFER_SIZE]; +gstring gs = { .size = HEADER_ADD_BUFFER_SIZE, .ptr = 0, .s = buffer }; -if (header_last == NULL) return; +if (!header_last) return NULL; -if (!string_vformat(buffer, sizeof(buffer), format, ap)) +if (!string_vformat(&gs, FALSE, format, ap)) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "string too long in header_add: " - "%.100s ...", buffer); + "%.100s ...", string_from_gstring(&gs)); +string_from_gstring(&gs); /* Find where to insert this header */ -if (name == NULL) +if (!name) { if (after) { @@ -122,7 +124,7 @@ if (name == NULL) received header is allocated and when it is actually filled in. We want that header to be first, so skip it for now. */ - if (header_list->text == NULL) + if (!header_list->text) hptr = &header_list->next; h = *hptr; } @@ -134,15 +136,14 @@ else /* Find the first non-deleted header with the correct name. */ - for (hptr = &header_list; (h = *hptr) != NULL; hptr = &(h->next)) - { - if (header_testname(h, name, len, TRUE)) break; - } + for (hptr = &header_list; (h = *hptr); hptr = &h->next) + if (header_testname(h, name, len, TRUE)) + break; /* Handle the case where no header is found. To insert at the bottom, nothing needs to be done. */ - if (h == NULL) + if (!h) { if (topnot) { @@ -155,14 +156,12 @@ else true. In this case, we want to include deleted headers in the block. */ else if (after) - { for (;;) { - if (h->next == NULL || !header_testname(h, name, len, FALSE)) break; + if (!h->next || !header_testname(h, name, len, FALSE)) break; hptr = &(h->next); h = h->next; } - } } /* Loop for multiple header lines, taking care about continuations. At this @@ -174,7 +173,7 @@ for (p = q = buffer; *p != 0; ) for (;;) { q = Ustrchr(q, '\n'); - if (q == NULL) q = p + Ustrlen(p); + if (!q) q = p + Ustrlen(p); if (*(++q) != ' ' && *q != '\t') break; } @@ -187,9 +186,10 @@ for (p = q = buffer; *p != 0; ) *hptr = new; hptr = &(new->next); - if (h == NULL) header_last = new; + if (!h) header_last = new; p = q; } +return new; } @@ -207,20 +207,33 @@ Arguments: format sprintf format ... format arguments -Returns: nothing +Returns: pointer to header struct added */ -void -header_add_at_position(BOOL after, uschar *name, BOOL topnot, int type, +header_line * +header_add_at_position_internal(BOOL after, uschar *name, BOOL topnot, int type, const char *format, ...) { +header_line * h; va_list ap; va_start(ap, format); -header_add_backend(after, name, topnot, type, format, ap); +h = header_add_backend(after, name, topnot, type, format, ap); va_end(ap); +return h; } +/* Documented external i/f for local_scan */ +void +header_add_at_position(BOOL after, uschar *name, BOOL topnot, int type, + const char *format, ...) +{ +header_line * h; +va_list ap; +va_start(ap, format); +(void) header_add_backend(after, name, topnot, type, format, ap); +va_end(ap); +} /************************************************* * Add new header on end of chain * @@ -241,7 +254,7 @@ header_add(int type, const char *format, ...) { va_list ap; va_start(ap, format); -header_add_backend(TRUE, NULL, FALSE, type, format, ap); +(void) header_add_backend(TRUE, NULL, FALSE, type, format, ap); va_end(ap); } @@ -265,17 +278,14 @@ Returns: nothing void header_remove(int occ, const uschar *name) { -header_line *h; int hcount = 0; int len = Ustrlen(name); -for (h = header_list; h != NULL; h = h->next) - { +for (header_line * h = header_list; h; h = h->next) if (header_testname(h, name, len, TRUE) && (occ <= 0 || ++hcount == occ)) { h->type = htype_old; if (occ > 0) return; } - } } @@ -359,7 +369,6 @@ static BOOL one_pattern_match(uschar *name, int slen, BOOL has_addresses, uschar *pattern) { BOOL yield = FALSE; -header_line *h; const pcre *re = NULL; /* If the pattern is a regex, compile it. Bomb out if compiling fails; these @@ -369,7 +378,7 @@ if (*pattern == '^') re = regex_must_compile(pattern, TRUE, FALSE); /* Scan for the required header(s) and scan each one */ -for (h = header_list; !yield && h != NULL; h = h->next) +for (header_line * h = header_list; !yield && h; h = h->next) { if (h->type == htype_old || slen > h->slen || strncmpic(name, h->text, slen) != 0) @@ -382,7 +391,7 @@ for (h = header_list; !yield && h != NULL; h = h->next) { uschar *s = h->text + slen; - while (!yield && *s != 0) + while (!yield && *s) { uschar *error, *next; uschar *e = parse_find_address_end(s, FALSE); @@ -439,17 +448,14 @@ header_match(uschar *name, BOOL has_addresses, BOOL cond, string_item *strings, int count, ...) { va_list ap; -string_item *s; -int i; int slen = Ustrlen(name); -for (s = strings; s != NULL; s = s->next) - { - if (one_pattern_match(name, slen, has_addresses, s->text)) return cond; - } +for (string_item * s = strings; s; s = s->next) + if (one_pattern_match(name, slen, has_addresses, s->text)) + return cond; va_start(ap, count); -for (i = 0; i < count; i++) +for (int i = 0; i < count; i++) if (one_pattern_match(name, slen, has_addresses, va_arg(ap, uschar *))) { va_end(ap);