From: Ian Jackson Date: Fri, 24 Oct 2014 21:12:33 +0000 (+0100) Subject: Config parsing: Provide a way to ignore unknown resolv.conf contents X-Git-Tag: adns-1.5.0-rc1~11 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=adns.git;a=commitdiff_plain;h=aed8dc89c34d42cd8d20e1b1c2aa110785fa5595 Config parsing: Provide a way to ignore unknown resolv.conf contents You can now set the option `adns_ignoreunkcfg'. This is relevant to Debian #411263. Signed-off-by: Ian Jackson --- diff --git a/regress/init-unkopts.text b/regress/init-unkopts.text index 2688162..617bac4 100644 --- a/regress/init-unkopts.text +++ b/regress/init-unkopts.text @@ -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 diff --git a/src/adns.h b/src/adns.h index 4cabc4a..a6599f6 100644 --- a/src/adns.h +++ b/src/adns.h @@ -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 diff --git a/src/internal.h b/src/internal.h index f496fcb..9334a6f 100644 --- a/src/internal.h +++ b/src/internal.h @@ -394,6 +394,7 @@ struct adns__state { adns_sockaddr base, mask; } sortlist[MAXSORTLIST]; char **searchlist; + unsigned config_report_unknown:1; unsigned short rand48xsubi[3]; }; diff --git a/src/setup.c b/src/setup.c index 17a0d8e..c5ffed6 100644 --- a/src/setup.c +++ b/src/setup.c @@ -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;