T
[adns] / src / setup.c
index 17a0d8e..e9466c2 100644 (file)
@@ -260,25 +260,27 @@ static void ccf_sortlist(adns_state ads, const char *fn,
 
 static void ccf_options(adns_state ads, const char *fn,
                        int lno, const char *buf) {
-  const char *word, *rhs;
+  const char *word, *endword;
   char *ep;
   unsigned long v;
   int i,l;
 
   if (!buf) return;
 
-#define OPTION__IS(s,op) (l op (sizeof(s)-1) && !memcmp(word,s,(sizeof(s)-1)))
+#define OPTION__IS(s,op) ((endword-word) op (sizeof(s)-1) && \
+                         !memcmp(word,s,(sizeof(s)-1)))
 #define OPTION_IS(s)     (OPTION__IS(s,==))
-#define OPTION_STARTS(s) (OPTION__IS(s,>=) ? ((rhs=word+sizeof(s)-1)) : 0)
+#define OPTION_STARTS(s) (OPTION__IS(s,>=) ? ((word+=sizeof(s)-1)) : 0)
 
   while (nextword(&buf,&word,&l)) {
+    endword=word+l;
     if (OPTION_IS("debug")) {
       ads->iflags |= adns_if_debug;
       continue;
     }
     if (OPTION_STARTS("ndots:")) {
-      v= strtoul(rhs,&ep,10);
-      if (ep==rhs || ep != word+l || v > INT_MAX) {
+      v= strtoul(word,&ep,10);
+      if (ep==rhs || ep != endword || v > INT_MAX) {
        configparseerr(ads,fn,lno,"option `%.*s' malformed"
                       " or has bad value",l,word);
        continue;
@@ -321,6 +323,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 +339,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 +382,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 +514,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 +628,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;