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)
{
-header_line *h, *new;
+header_line *h, *new = NULL;
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) return;
+if (!header_last) return NULL;
if (!string_vformat(&gs, FALSE, format, ap))
log_write(0, LOG_MAIN|LOG_PANIC_DIE, "string too long in header_add: "
/* Find where to insert this header */
if (!name)
- {
if (after)
{
- hptr = &(header_last->next);
+ hptr = &header_last->next;
h = NULL;
}
else
hptr = &header_list->next;
h = *hptr;
}
- }
else
{
for (;;)
{
if (!h->next || !header_testname(h, name, len, FALSE)) break;
- hptr = &(h->next);
+ hptr = &h->next;
h = h->next;
}
}
point, we have hptr pointing to the link field that will point to the new
header, and h containing the following header, or NULL. */
-for (p = q = buffer; *p != 0; )
+for (p = q = buffer; *p; p = q)
{
for (;;)
{
new->next = h;
*hptr = new;
- hptr = &(new->next);
+ hptr = &new->next;
if (!h) header_last = new;
- p = q;
}
+return new;
}
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, ...)
+{
+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 *
{
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);
}