chiark
/
gitweb
/
~ianmdlvl
/
adns.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
resolv.conf option parsing: Fix word separation
[adns.git]
/
src
/
setup.c
diff --git
a/src/setup.c
b/src/setup.c
index 17a0d8e31c27fad8b4b9421f770f8613b667bbbb..2de3eaa023ce1cf177555f77d652e0790ba7006b 100644
(file)
--- 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) {
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;
char *ep;
unsigned long v;
- int
i,
l;
+ int l;
if (!buf) return;
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_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)) {
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:")) {
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"
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:")) {
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;
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;
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' "
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:")) {
}
continue;
}
if (OPTION_STARTS("adns_af:")) {
- word= rhs;
ads->iflags &= ~adns_if_afmask;
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;
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'},...)",
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;
}
break;
}
- if (!
word[i]
) break;
- word=
word + i +
1;
+ if (!
comma
) break;
+ word=
comma+
1;
}
continue;
}
}
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:") ||
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 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
}
#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: 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;
}
}
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) {
!(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++;
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->tcpstate= server_disconnected;
timerclear(&ads->tcptimeout);
ads->searchlist= 0;
+ ads->config_report_unknown=1;
pid= getpid();
ads->rand48xsubi[0]= pid;
pid= getpid();
ads->rand48xsubi[0]= pid;