Config parsing: Provide a way to ignore unknown resolv.conf contents
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 24 Oct 2014 21:12:33 +0000 (22:12 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 26 Oct 2014 11:45:58 +0000 (11:45 +0000)
You can now set the option `adns_ignoreunkcfg'.  This is relevant to
Debian #411263.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
regress/init-unkopts.text
src/adns.h
src/internal.h
src/setup.c

index 2688162..617bac4 100644 (file)
@@ -4,3 +4,5 @@ search davenant.greenend.org.uk greenend.org.uk
 lwserver 127.0.0.1
 options timeout:1 attempts:30 rotate no-check-names inet6 edns0 wombat
 stoat
+options adns_ignoreunkcfg wombat2
+stoat2
index 4cabc4a..a6599f6 100644 (file)
@@ -589,6 +589,12 @@ int adns_init_logfn(adns_state *newstate_r, adns_initflags flags,
  *   Lookups occur (logically) concurrently; use the `sortlist' directive to
  *   control the relative order of addresses in answers.  This option
  *   overrides the corresponding init flags (covered by adns_if_afmask).
+ *
+ *  adns_ignoreunkcfg
+ *   Ignore unknown options and configuration directives, rather than
+ *   logging them.  To be effective, appear in the configuration
+ *   before the unknown options.  ADNS_RES_OPTIONS is generally early
+ *   enough.
  * 
  * There are a number of environment variables which can modify the
  * behaviour of adns.  They take effect only if adns_init is used, and
index f496fcb..9334a6f 100644 (file)
@@ -394,6 +394,7 @@ struct adns__state {
     adns_sockaddr base, mask;
   } sortlist[MAXSORTLIST];
   char **searchlist;
+  unsigned config_report_unknown:1;
   unsigned short rand48xsubi[3];
 };
 
index 17a0d8e..c5ffed6 100644 (file)
@@ -321,6 +321,10 @@ static void ccf_options(adns_state ads, const char *fn,
       }
       continue;
     }
+    if (OPTION_IS("adns_ignoreunkcfg")) {
+      ads->config_report_unknown=0;
+      continue;
+    }
     if (/* adns's query strategy is not configurable */
        OPTION_STARTS("timeout:") ||
        OPTION_STARTS("attempts:") ||
@@ -333,7 +337,8 @@ static void ccf_options(adns_state ads, const char *fn,
        /* adns does not do edns0 and this is not a problem */
        OPTION_IS("edns0"))
       continue;
-    adns__diag(ads,-1,0,"%s:%d: unknown option `%.*s'", fn,lno, l,word);
+    if (ads->config_report_unknown)
+      adns__diag(ads,-1,0,"%s:%d: unknown option `%.*s'", fn,lno, l,word);
   }
 
 #undef OPTION__IS
@@ -375,8 +380,9 @@ static void ccf_lookup(adns_state ads, const char *fn, int lno,
       adns__diag(ads,-1,0,"%s:%d: yp lookups not supported by adns", fn,lno);
       found_bind=-1;
     } else {
-      adns__diag(ads,-1,0,"%s:%d: unknown `lookup' database `%.*s'",
-                fn,lno, l,word);
+      if (ads->config_report_unknown)
+       adns__diag(ads,-1,0,"%s:%d: unknown `lookup' database `%.*s'",
+                  fn,lno, l,word);
       found_bind=-1;
     }
   }
@@ -506,8 +512,9 @@ static void readconfiggeneric(adns_state ads, const char *filename,
           !(strlen(ccip->name)==dirl && !memcmp(ccip->name,p,q-p));
         ccip++);
     if (!ccip->name) {
-      adns__diag(ads,-1,0,"%s:%d: unknown configuration directive `%.*s'",
-                filename,lno,(int)(q-p),p);
+      if (ads->config_report_unknown)
+       adns__diag(ads,-1,0,"%s:%d: unknown configuration directive `%.*s'",
+                  filename,lno,(int)(q-p),p);
       continue;
     }
     while (ctype_whitespace(*q)) q++;
@@ -619,6 +626,7 @@ static int init_begin(adns_state *ads_r, adns_initflags flags,
   ads->tcpstate= server_disconnected;
   timerclear(&ads->tcptimeout);
   ads->searchlist= 0;
+  ads->config_report_unknown=1;
 
   pid= getpid();
   ads->rand48xsubi[0]= pid;