X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/229f72fa85fb16abdb2ee760c0d89f28b6151d64..795e3902b12f7c52095c673a11db5b6f7a67bbf5:/src/setup.c diff --git a/src/setup.c b/src/setup.c index 3ebcd21..e9466c2 100644 --- a/src/setup.c +++ b/src/setup.c @@ -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,7 +323,24 @@ static void ccf_options(adns_state ads, const char *fn, } continue; } - adns__diag(ads,-1,0,"%s:%d: unknown option `%.*s'", fn,lno, l,word); + 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:") || + OPTION_IS("rotate") || + /* adns provides the application with knob for this */ + OPTION_IS("no-check-names") || + /* adns normally does IPv6 if the application wants it; control + * this with the adns_af: option if you like */ + OPTION_IS("inet6") || + /* adns does not do edns0 and this is not a problem */ + OPTION_IS("edns0")) + continue; + if (ads->config_report_unknown) + adns__diag(ads,-1,0,"%s:%d: unknown option `%.*s'", fn,lno, l,word); } #undef OPTION__IS @@ -363,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; } } @@ -372,6 +392,10 @@ static void ccf_lookup(adns_state ads, const char *fn, int lno, adns__diag(ads,-1,0,"%s:%d: `lookup' specified, but not `bind'", fn,lno); } +static void ccf_ignore(adns_state ads, const char *fn, int lno, + const char *buf) { +} + static const struct configcommandinfo { const char *name; void (*fn)(adns_state ads, const char *fn, int lno, const char *buf); @@ -384,6 +408,7 @@ static const struct configcommandinfo { { "clearnameservers", ccf_clearnss }, { "include", ccf_include }, { "lookup", ccf_lookup }, /* OpenBSD */ + { "lwserver", ccf_ignore }, /* BIND9 lwresd */ { 0 } }; @@ -489,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++; @@ -602,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;