Added Tony's defer_foo patch to dnsdb lookups.
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Mon, 20 Dec 2004 15:24:27 +0000 (15:24 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Mon, 20 Dec 2004 15:24:27 +0000 (15:24 +0000)
doc/doc-txt/ChangeLog
doc/doc-txt/NewStuff
src/ACKNOWLEDGMENTS
src/src/lookups/dnsdb.c

index 6774dad4a96c6ed619c18ff40441446e0efd1cc7..a12145aebedd837c6cf722af90c66953c8e02715 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.46 2004/12/20 14:57:05 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.47 2004/12/20 15:24:27 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -157,7 +157,8 @@ Exim version 4.50
         just the host names, not the priorities.
 
     (3) It is now possible to give a list of domains (or IP addresses) to be
         just the host names, not the priorities.
 
     (3) It is now possible to give a list of domains (or IP addresses) to be
-        looked up.
+        looked up. The behaviour when one of the lookups defers can be
+        controlled by a keyword.
 
     (4) It is now possible to specify the separator character for use when
         multiple records are returned.
 
     (4) It is now possible to specify the separator character for use when
         multiple records are returned.
index 16c9c465374ec3878ffa6d3197a9c31c7e140de6..3109ea96faab3cc02de663b835ce48d16058727a 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/NewStuff,v 1.20 2004/12/17 14:52:44 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/NewStuff,v 1.21 2004/12/20 15:24:27 ph10 Exp $
 
 New Features in Exim
 --------------------
 
 New Features in Exim
 --------------------
@@ -152,9 +152,21 @@ Version 4.50
     single item are handled.
 
     The dnsdb lookup fails only if all the DNS lookups fail. If there is a
     single item are handled.
 
     The dnsdb lookup fails only if all the DNS lookups fail. If there is a
-    temporary DNS error for any of them, the remaining lookups are still done,
-    and only if none of them succeed does the dnsdb lookup defer. As long as at
-    least one of the DNS lookups yields some data, the dnsdb lookup succeeds.
+    temporary DNS error for any of them, the behaviour is controlled by
+    an optional keyword followed by a comma that may appear before the record
+    type. The possible keywords are "defer_strict", "defer_never", and
+    "defer_lax". With "strict" behaviour, any temporary DNS error causes the
+    whole lookup to defer. With "never" behaviour, a temporary DNS error is
+    ignored, and the behaviour is as if the DNS lookup failed to find anything.
+    With "lax" behaviour, all the queries are attempted, but a temporary DNS
+    error causes the whole lookup to defer only if none of the other lookups
+    succeed. The default is "lax", so the following lookups are equivalent:
+
+      ${lookup dnsdb{defer_lax,a=one.host.com:two.host.com}}
+      ${lookup dnsdb{a=one.host.com:two.host.com}}
+
+    Thus, in the default case, as long as at least one of the DNS lookups
+    yields some data, the dnsdb lookup succeeds.
 
 15. It is now possible to specify the character to be used as a separator when
     a dnsdb lookup returns data from more than one DNS record. The default is a
 
 15. It is now possible to specify the character to be used as a separator when
     a dnsdb lookup returns data from more than one DNS record. The default is a
index a914262c708998dd54e129506a8598c55cb54473..3c591fb9c5538b5705d651a71e11fd848b413cdd 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.8 2004/12/20 14:57:05 ph10 Exp $
+$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.9 2004/12/20 15:24:28 ph10 Exp $
 
 EXIM ACKNOWLEDGEMENTS
 
 
 EXIM ACKNOWLEDGEMENTS
 
@@ -123,6 +123,7 @@ Tony Finch                Expansion extensions
                             Patch for more daemon exiwhat information
                             Patch for -dd 
                             Patch for mxh lookup type in dnsdb 
                             Patch for more daemon exiwhat information
                             Patch for -dd 
                             Patch for mxh lookup type in dnsdb 
+                            Patch for defer_foo in dndsb 
 Giuliano Gavazzi          Patches for OSX compilation
 Dominic Germain           Patch for exiqgrep MacOS X bug
 Oliver Gorwits            $load_average patch
 Giuliano Gavazzi          Patches for OSX compilation
 Dominic Germain           Patch for exiqgrep MacOS X bug
 Oliver Gorwits            $load_average patch
index 3f9dc8e7806dc365711a97150a9e5718f5885eab..9cd8612b10c35fef6bb16c1ab6374f90720cc8fb 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/lookups/dnsdb.c,v 1.5 2004/11/25 14:31:28 ph10 Exp $ */
+/* $Cambridge: exim/src/src/lookups/dnsdb.c,v 1.6 2004/12/20 15:24:28 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -86,11 +86,17 @@ consist of a number of parts.
 separator character that is used when multiple records are found. The default 
 separator is newline.
 
 separator character that is used when multiple records are found. The default 
 separator is newline.
 
-(b) If the next sequence of characters is a sequence of letters and digits 
+(b) If the next sequence of characters is 'defer_FOO' followed by a comma,
+the defer behaviour is set to FOO. The possible behaviours are: 'strict', where
+any defer causes the whole lookup to defer; 'lax', where a defer causes the
+whole lookup to defer only if none of the DNS queries succeeds; and 'never',
+where all defers are as if the lookup failed. The default is 'lax'.
+
+(c) If the next sequence of characters is a sequence of letters and digits 
 followed by '=', it is interpreted as the name of the DNS record type. The 
 followed by '=', it is interpreted as the name of the DNS record type. The 
-default is "A".
+default is "TXT".
 
 
-(c) Then there follows list of domain names. This is a generalized Exim list, 
+(d) Then there follows list of domain names. This is a generalized Exim list, 
 which may start with '<' in order to set a specific separator. The default 
 separator, as always, is colon. */
 
 which may start with '<' in order to set a specific separator. The default 
 separator, as always, is colon. */
 
@@ -102,6 +108,7 @@ int rc;
 int size = 256;
 int ptr = 0;
 int sep = 0;
 int size = 256;
 int ptr = 0;
 int sep = 0;
+int defer_mode = PASS;
 int type = T_TXT;
 int failrc = FAIL;
 uschar *outsep = US"\n";
 int type = T_TXT;
 int failrc = FAIL;
 uschar *outsep = US"\n";
@@ -132,6 +139,40 @@ if (*keystring == '>')
   while (isspace(*keystring)) keystring++;
   } 
 
   while (isspace(*keystring)) keystring++;
   } 
 
+/* Check for a defer behaviour keyword. */
+
+if (strncmpic(keystring, US"defer_", 6) == 0)
+  {
+  keystring += 6;
+  if (strncmpic(keystring, US"strict", 6) == 0)
+    {
+    defer_mode = DEFER;
+    keystring += 6;
+    }
+  else if (strncmpic(keystring, US"lax", 3) == 0)
+    {
+    defer_mode = PASS;
+    keystring += 3;
+    }
+  else if (strncmpic(keystring, US"never", 5) == 0)
+    {
+    defer_mode = OK;
+    keystring += 5;
+    }
+  else
+    {
+    *errmsg = US"unsupported dnsdb defer behaviour";
+    return DEFER;
+    }
+  while (isspace(*keystring)) keystring++;
+  if (*keystring++ != ',')
+    {
+    *errmsg = US"dnsdb defer behaviour syntax error";
+    return DEFER;
+    }
+  while (isspace(*keystring)) keystring++;
+  }
+
 /* If the keystring contains an = this must be preceded by a valid type name. */
 
 if ((equals = Ustrchr(keystring, '=')) != NULL)
 /* If the keystring contains an = this must be preceded by a valid type name. */
 
 if ((equals = Ustrchr(keystring, '=')) != NULL)
@@ -214,8 +255,9 @@ while ((domain = string_nextinlist(&keystring, &sep, buffer, sizeof(buffer)))
   if (rc == DNS_NOMATCH || rc == DNS_NODATA) continue;
   if (rc != DNS_SUCCEED)
     {
   if (rc == DNS_NOMATCH || rc == DNS_NODATA) continue;
   if (rc != DNS_SUCCEED)
     {
-    failrc = DEFER;
-    continue;
+    if (defer_mode == DEFER) return DEFER;          /* always defer */
+      else if (defer_mode == PASS) failrc = DEFER;  /* defer only if all do */
+    continue;                                       /* treat defer as fail */
     }
   
   /* Search the returned records */
     }
   
   /* Search the returned records */