X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fsetup.c;h=2de3eaa023ce1cf177555f77d652e0790ba7006b;hb=e45372c163ef6a942f7856acf87173c8a79c3d85;hp=17a0d8e31c27fad8b4b9421f770f8613b667bbbb;hpb=ff7fd0e703f595103dc45ba808752ee55f2455cb;p=adns.git diff --git a/src/setup.c b/src/setup.c index 17a0d8e..2de3eaa 100644 --- a/src/setup.c +++ b/src/setup.c @@ -260,67 +260,74 @@ 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 *opt, *word, *endword, *endopt; char *ep; unsigned long v; - int i,l; + int 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)) { + opt=word; + endopt=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==word || ep != endword || v > INT_MAX) { configparseerr(ads,fn,lno,"option `%.*s' malformed" - " or has bad value",l,word); + " or has bad value",l,opt); continue; } ads->searchndots= v; continue; } if (OPTION_STARTS("adns_checkc:")) { - if (!strcmp(rhs,"none")) { + if (OPTION_IS("none")) { ads->iflags &= ~adns_if_checkc_freq; ads->iflags |= adns_if_checkc_entex; - } else if (!strcmp(rhs,"entex")) { + } else if (OPTION_IS("entex")) { ads->iflags &= ~adns_if_checkc_freq; ads->iflags |= adns_if_checkc_entex; - } else if (!strcmp(rhs,"freq")) { + } else if (OPTION_IS("freq")) { ads->iflags |= adns_if_checkc_freq; } else { configparseerr(ads,fn,lno, "option adns_checkc has bad value `%s' " - "(must be none, entex or freq", rhs); + "(must be none, entex or freq", word); } continue; } if (OPTION_STARTS("adns_af:")) { - word= rhs; ads->iflags &= ~adns_if_afmask; - if (strcmp(word,"any")) for (;;) { - i= strcspn(word,","); - if (i>=4 && !memcmp(word,"ipv4",4)) + if (!OPTION_IS("any")) for (;;) { + const char *comma= memchr(word,',',endopt-word); + endword=comma?comma:endopt; + if (OPTION_IS("ipv4")) ads->iflags |= adns_if_permit_ipv4; - else if (i>=4 && !memcmp(word,"ipv6",4)) + else if (OPTION_IS("ipv6")) ads->iflags |= adns_if_permit_ipv6; else { configparseerr(ads,fn,lno, "option adns_af has bad value `%.*s' " "(must be `any' or list {`ipv4',`ipv6'},...)", - i, word); + (int)(endword-word), word); break; } - if (!word[i]) break; - word= word + i + 1; + if (!comma) break; + word= comma+1; } 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 +340,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,opt); } #undef OPTION__IS @@ -375,8 +383,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 +515,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 +629,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;