tidying
[exim.git] / src / src / header.c
index 2cac551c686e30913e7b6fcb84bc9a1c6a81777e..51aa9f953e6f4638300107b5d9f8e53df1fd34df 100644 (file)
@@ -1,10 +1,8 @@
-/* $Cambridge: exim/src/src/header.c,v 1.1 2004/10/07 10:39:01 ph10 Exp $ */
-
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2004 */
+/* Copyright (c) University of Cambridge 1995 - 2016 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 
@@ -30,7 +28,7 @@ Returns:    TRUE or FALSE
 */
 
 BOOL
-header_testname(header_line *h, uschar *name, int len, BOOL notdel)
+header_testname(header_line *h, const uschar *name, int len, BOOL notdel)
 {
 uschar *tt;
 if (h->type == '*' && notdel) return FALSE;
@@ -40,6 +38,19 @@ while (*tt == ' ' || *tt == '\t') tt++;
 return *tt == ':';
 }
 
+/* This is a copy of the function above, only that it is possible to pass
+   only the beginning of a header name. It simply does a front-anchored
+   substring match. Arguments and Return codes are the same as for
+   header_testname() above. */
+
+BOOL
+header_testname_incomplete(header_line *h, const uschar *name,
+    int len, BOOL notdel)
+{
+if (h->type == '*' && notdel) return FALSE;
+if (h->text == NULL || strncmpic(h->text, name, len) != 0) return FALSE;
+return TRUE;
+}
 
 
 /*************************************************
@@ -80,7 +91,7 @@ Returns:    nothing
 
 static void
 header_add_backend(BOOL after, uschar *name, BOOL topnot, int type,
-  char *format, va_list ap)
+  const char *format, va_list ap)
 {
 header_line *h, *new;
 header_line **hptr;
@@ -88,7 +99,7 @@ header_line **hptr;
 uschar *p, *q;
 uschar buffer[HEADER_ADD_BUFFER_SIZE];
 
-if (header_last == NULL) return;
+if (!header_last) return;
 
 if (!string_vformat(buffer, sizeof(buffer), format, ap))
   log_write(0, LOG_MAIN|LOG_PANIC_DIE, "string too long in header_add: "
@@ -96,7 +107,7 @@ if (!string_vformat(buffer, sizeof(buffer), format, ap))
 
 /* Find where to insert this header */
 
-if (name == NULL)
+if (!name)
   {
   if (after)
     {
@@ -106,7 +117,14 @@ if (name == NULL)
   else
     {
     hptr = &header_list;
-    h = header_list;
+
+    /* header_list->text can be NULL if we get here between when the new
+    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)
+      hptr = &header_list->next;
+    h = *hptr;
     }
   }
 
@@ -114,17 +132,16 @@ else
   {
   int len = Ustrlen(name);
 
-  /* Find the first non-deleted header witht the correct name. */
+  /* 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)
       {
@@ -137,14 +154,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
@@ -156,7 +171,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;
     }
 
@@ -169,7 +184,7 @@ for (p = q = buffer; *p != 0; )
   *hptr = new;
   hptr = &(new->next);
 
-  if (h == NULL) header_last = new;
+  if (!h) header_last = new;
   p = q;
   }
 }
@@ -194,7 +209,7 @@ Returns:    nothing
 
 void
 header_add_at_position(BOOL after, uschar *name, BOOL topnot, int type,
-  char *format, ...)
+  const char *format, ...)
 {
 va_list ap;
 va_start(ap, format);
@@ -219,7 +234,7 @@ Returns:    nothing
 */
 
 void
-header_add(int type, char *format, ...)
+header_add(int type, const char *format, ...)
 {
 va_list ap;
 va_start(ap, format);
@@ -245,7 +260,7 @@ Returns:        nothing
 */
 
 void
-header_remove(int occ, uschar *name)
+header_remove(int occ, const uschar *name)
 {
 header_line *h;
 int hcount = 0;
@@ -432,10 +447,11 @@ for (s = strings; s != NULL; s = s->next)
 
 va_start(ap, count);
 for (i = 0; i < count; i++)
-  {
   if (one_pattern_match(name, slen, has_addresses, va_arg(ap, uschar *)))
+    {
+    va_end(ap);
     return cond;
-  }
+    }
 va_end(ap);
 
 return !cond;