Thanks to Tony Finch for the program and the performance figure.
* New internal consistency checking with assert if right options set.
* New adns_wait_poll function like adns_wait but uses poll, not select.
- * New adnshost utility - currently only a usage message :-).
+ * New adnshost utility - very alpha.
+ * New adns_errtypeabbrev function.
Incompatible changes:
* RRs with mailboxes never rejected due to strange chars if _raw.
* Lack of a mailbox produces `.' not `<>'.
* Better usage messages (and no default query domain) for adnstest.
* Return EAGAIN from _check instead of EWOULDBLOCK.
+ * adns_rr_info on _r_mx etc. shows status type abbrev and status number.
Bugfixes:
* Do not invoke __autosys indirectly from __procdgram (result: coredump
greenend.org.uk flags 0 type RP(raw) ownflags=a: nodata; nrrs=0; cname=$; owner=$; ttl=86400
greenend.org.uk flags 0 type A(addr) ownflags=a: nodata; nrrs=0; cname=$; owner=$; ttl=86400
greenend.org.uk flags 0 type NS(+addr) ownflags=a: ok; nrrs=2; cname=$; owner=$; ttl=86400
- ns0.relativity.greenend.org.uk ok "OK" ( INET 172.18.45.6 )
- ns1.relativity.greenend.org.uk ok "OK" ( INET 172.18.45.65 )
+ ns0.relativity.greenend.org.uk ok 0 ok "OK" ( INET 172.18.45.6 )
+ ns1.relativity.greenend.org.uk ok 0 ok "OK" ( INET 172.18.45.65 )
greenend.org.uk flags 0 type PTR(checked) ownflags=a: nodata; nrrs=0; cname=$; owner=$; ttl=86400
greenend.org.uk flags 0 type MX(+addr) ownflags=a: ok; nrrs=1; cname=$; owner=$; ttl=86400
- 10 chiark.greenend.org.uk ok "OK" ( INET 195.224.76.132 )
+ 10 chiark.greenend.org.uk ok 0 ok "OK" ( INET 195.224.76.132 )
greenend.org.uk flags 0 type SOA(822) ownflags=a: ok; nrrs=1; cname=$; owner=$; ttl=86400
ns.chiark.greenend.org.uk hostmaster@greenend.org.uk 1999061300 28800 7200 604800 86400
greenend.org.uk flags 0 type RP(822) ownflags=a: nodata; nrrs=0; cname=$; owner=$; ttl=86400
30 172.18.45.36
40 cname-ptr.test.iwj.relativity.greenend.org.uk
broken-mail.test.iwj.relativity.greenend.org.uk. flags 0 type MX(+addr): OK; nrrs=4; cname=$; owner=$; ttl=30
- 10 manyaddrs.test.iwj.relativity.greenend.org.uk ok "OK" ( INET 127.0.0.1 INET 172.18.45.6 INET 172.18.45.1 INET 172.18.45.35 )
- 20 host.broken-delg.test.iwj.relativity.greenend.org.uk timeout "DNS query timed out" ?
- 30 172.18.45.36 nxdomain "No such domain" ( )
- 40 cname-ptr.test.iwj.relativity.greenend.org.uk prohibitedcname "DNS alias found where canonical name wanted" ( )
+ 10 manyaddrs.test.iwj.relativity.greenend.org.uk ok 0 ok "OK" ( INET 127.0.0.1 INET 172.18.45.6 INET 172.18.45.1 INET 172.18.45.35 )
+ 20 host.broken-delg.test.iwj.relativity.greenend.org.uk remotefail 30 timeout "DNS query timed out" ?
+ 30 172.18.45.36 permfail 300 nxdomain "No such domain" ( )
+ 40 cname-ptr.test.iwj.relativity.greenend.org.uk misconfig 101 prohibitedcname "DNS alias found where canonical name wanted" ( )
broken-mail.test.iwj.relativity.greenend.org.uk. flags 256 type MX(+addr): OK; nrrs=4; cname=$; owner=$; ttl=30
- 10 manyaddrs.test.iwj.relativity.greenend.org.uk ok "OK" ( INET 127.0.0.1 INET 172.18.45.6 INET 172.18.45.1 INET 172.18.45.35 )
- 20 host.broken-delg.test.iwj.relativity.greenend.org.uk timeout "DNS query timed out" ?
- 30 172.18.45.36 nxdomain "No such domain" ( )
- 40 cname-ptr.test.iwj.relativity.greenend.org.uk ok "OK" ( INET 172.18.45.37 )
+ 10 manyaddrs.test.iwj.relativity.greenend.org.uk ok 0 ok "OK" ( INET 127.0.0.1 INET 172.18.45.6 INET 172.18.45.1 INET 172.18.45.35 )
+ 20 host.broken-delg.test.iwj.relativity.greenend.org.uk remotefail 30 timeout "DNS query timed out" ?
+ 30 172.18.45.36 permfail 300 nxdomain "No such domain" ( )
+ 40 cname-ptr.test.iwj.relativity.greenend.org.uk ok 0 ok "OK" ( INET 172.18.45.37 )
broken-mail.test.iwj.relativity.greenend.org.uk. flags 260 type MX(+addr): OK; nrrs=4; cname=$; owner=broken-mail.test.iwj.relativity.greenend.org.uk; ttl=30
- 10 manyaddrs.test.iwj.relativity.greenend.org.uk ok "OK" ( INET 127.0.0.1 INET 172.18.45.6 INET 172.18.45.1 INET 172.18.45.35 )
- 20 host.broken-delg.test.iwj.relativity.greenend.org.uk timeout "DNS query timed out" ?
- 30 172.18.45.36 nxdomain "No such domain" ( )
- 40 cname-ptr.test.iwj.relativity.greenend.org.uk ok "OK" ( INET 172.18.45.37 )
+ 10 manyaddrs.test.iwj.relativity.greenend.org.uk ok 0 ok "OK" ( INET 127.0.0.1 INET 172.18.45.6 INET 172.18.45.1 INET 172.18.45.35 )
+ 20 host.broken-delg.test.iwj.relativity.greenend.org.uk remotefail 30 timeout "DNS query timed out" ?
+ 30 172.18.45.36 permfail 300 nxdomain "No such domain" ( )
+ 40 cname-ptr.test.iwj.relativity.greenend.org.uk ok 0 ok "OK" ( INET 172.18.45.37 )
rc=0
chiark.greenend.org.uk flags 4 type NS(+addr): No such data; nrrs=0; cname=$; owner=chiark.greenend.org.uk; ttl=86400
chiark.greenend.org.uk flags 4 type PTR(checked): No such data; nrrs=0; cname=$; owner=chiark.greenend.org.uk; ttl=86400
chiark.greenend.org.uk flags 4 type MX(+addr): OK; nrrs=1; cname=$; owner=chiark.greenend.org.uk; ttl=86400
- 5 permutation-city.greenend.org.uk ok "OK" ( INET 195.224.76.134 )
+ 5 permutation-city.greenend.org.uk ok 0 ok "OK" ( INET 195.224.76.134 )
chiark.greenend.org.uk flags 4 type SOA(822): No such data; nrrs=0; cname=$; owner=chiark.greenend.org.uk; ttl=86400
chiark.greenend.org.uk flags 4 type RP(822): No such data; nrrs=0; cname=$; owner=chiark.greenend.org.uk; ttl=86400
rc=0
. flags 0 type RP(raw): No such data; nrrs=0; cname=$; owner=$; ttl=599
. flags 0 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=599
. flags 0 type NS(+addr): OK; nrrs=13; cname=$; owner=$; ttl=518399
- I.ROOT-SERVERS.NET ok "OK" ( INET 192.36.148.17 )
- F.ROOT-SERVERS.NET ok "OK" ( INET 192.5.5.241 )
- G.ROOT-SERVERS.NET ok "OK" ( INET 192.112.36.4 )
- J.ROOT-SERVERS.NET ok "OK" ( INET 198.41.0.10 )
- K.ROOT-SERVERS.NET ok "OK" ( INET 193.0.14.129 )
- L.ROOT-SERVERS.NET ok "OK" ( INET 198.32.64.12 )
- M.ROOT-SERVERS.NET ok "OK" ( INET 202.12.27.33 )
- A.ROOT-SERVERS.NET ok "OK" ( INET 198.41.0.4 )
- H.ROOT-SERVERS.NET ok "OK" ( INET 128.63.2.53 )
- B.ROOT-SERVERS.NET ok "OK" ( INET 128.9.0.107 )
- C.ROOT-SERVERS.NET ok "OK" ( INET 192.33.4.12 )
- D.ROOT-SERVERS.NET ok "OK" ( INET 128.8.10.90 )
- E.ROOT-SERVERS.NET ok "OK" ( INET 192.203.230.10 )
+ I.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.36.148.17 )
+ F.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.5.5.241 )
+ G.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.112.36.4 )
+ J.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.41.0.10 )
+ K.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 193.0.14.129 )
+ L.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.32.64.12 )
+ M.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 202.12.27.33 )
+ A.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.41.0.4 )
+ H.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.63.2.53 )
+ B.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.9.0.107 )
+ C.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.33.4.12 )
+ D.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.8.10.90 )
+ E.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.203.230.10 )
. flags 0 type PTR(checked): No such data; nrrs=0; cname=$; owner=$; ttl=599
. flags 0 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=599
. flags 0 type SOA(822): OK; nrrs=1; cname=$; owner=$; ttl=77975
. flags 1 type RP(raw): No such data; nrrs=0; cname=$; owner=$; ttl=599
. flags 1 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=599
. flags 1 type NS(+addr): OK; nrrs=13; cname=$; owner=$; ttl=518399
- G.ROOT-SERVERS.NET ok "OK" ( INET 192.112.36.4 )
- J.ROOT-SERVERS.NET ok "OK" ( INET 198.41.0.10 )
- K.ROOT-SERVERS.NET ok "OK" ( INET 193.0.14.129 )
- L.ROOT-SERVERS.NET ok "OK" ( INET 198.32.64.12 )
- M.ROOT-SERVERS.NET ok "OK" ( INET 202.12.27.33 )
- A.ROOT-SERVERS.NET ok "OK" ( INET 198.41.0.4 )
- H.ROOT-SERVERS.NET ok "OK" ( INET 128.63.2.53 )
- B.ROOT-SERVERS.NET ok "OK" ( INET 128.9.0.107 )
- C.ROOT-SERVERS.NET ok "OK" ( INET 192.33.4.12 )
- D.ROOT-SERVERS.NET ok "OK" ( INET 128.8.10.90 )
- E.ROOT-SERVERS.NET ok "OK" ( INET 192.203.230.10 )
- I.ROOT-SERVERS.NET ok "OK" ( INET 192.36.148.17 )
- F.ROOT-SERVERS.NET ok "OK" ( INET 192.5.5.241 )
+ G.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.112.36.4 )
+ J.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.41.0.10 )
+ K.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 193.0.14.129 )
+ L.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.32.64.12 )
+ M.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 202.12.27.33 )
+ A.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.41.0.4 )
+ H.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.63.2.53 )
+ B.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.9.0.107 )
+ C.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.33.4.12 )
+ D.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.8.10.90 )
+ E.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.203.230.10 )
+ I.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.36.148.17 )
+ F.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.5.5.241 )
. flags 1 type PTR(checked): No such data; nrrs=0; cname=$; owner=$; ttl=599
. flags 1 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=599
. flags 1 type SOA(822): OK; nrrs=1; cname=$; owner=$; ttl=70372
. flags 0 type RP(raw): No such data; nrrs=0; cname=$; owner=$; ttl=86400
. flags 0 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=599
. flags 0 type NS(+addr): OK; nrrs=13; cname=$; owner=$; ttl=305624
- I.ROOT-SERVERS.NET ok "OK" ( INET 192.36.148.17 )
- F.ROOT-SERVERS.NET ok "OK" ( INET 192.5.5.241 )
- G.ROOT-SERVERS.NET ok "OK" ( INET 192.112.36.4 )
- J.ROOT-SERVERS.NET ok "OK" ( INET 198.41.0.10 )
- K.ROOT-SERVERS.NET ok "OK" ( INET 193.0.14.129 )
- L.ROOT-SERVERS.NET ok "OK" ( INET 198.32.64.12 )
- M.ROOT-SERVERS.NET ok "OK" ( INET 202.12.27.33 )
- A.ROOT-SERVERS.NET ok "OK" ( INET 198.41.0.4 )
- H.ROOT-SERVERS.NET ok "OK" ( INET 128.63.2.53 )
- B.ROOT-SERVERS.NET ok "OK" ( INET 128.9.0.107 )
- C.ROOT-SERVERS.NET ok "OK" ( INET 192.33.4.12 )
- D.ROOT-SERVERS.NET ok "OK" ( INET 128.8.10.90 )
- E.ROOT-SERVERS.NET ok "OK" ( INET 192.203.230.10 )
+ I.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.36.148.17 )
+ F.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.5.5.241 )
+ G.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.112.36.4 )
+ J.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.41.0.10 )
+ K.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 193.0.14.129 )
+ L.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.32.64.12 )
+ M.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 202.12.27.33 )
+ A.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.41.0.4 )
+ H.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.63.2.53 )
+ B.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.9.0.107 )
+ C.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.33.4.12 )
+ D.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.8.10.90 )
+ E.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.203.230.10 )
. flags 0 type PTR(checked): No such data; nrrs=0; cname=$; owner=$; ttl=599
. flags 0 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=86400
. flags 0 type SOA(822): OK; nrrs=1; cname=$; owner=$; ttl=51616
. flags 1 type RP(raw): No such data; nrrs=0; cname=$; owner=$; ttl=86399
. flags 1 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=598
. flags 1 type NS(+addr): OK; nrrs=13; cname=$; owner=$; ttl=305623
- G.ROOT-SERVERS.NET ok "OK" ( INET 192.112.36.4 )
- J.ROOT-SERVERS.NET ok "OK" ( INET 198.41.0.10 )
- K.ROOT-SERVERS.NET ok "OK" ( INET 193.0.14.129 )
- L.ROOT-SERVERS.NET ok "OK" ( INET 198.32.64.12 )
- M.ROOT-SERVERS.NET ok "OK" ( INET 202.12.27.33 )
- A.ROOT-SERVERS.NET ok "OK" ( INET 198.41.0.4 )
- H.ROOT-SERVERS.NET ok "OK" ( INET 128.63.2.53 )
- B.ROOT-SERVERS.NET ok "OK" ( INET 128.9.0.107 )
- C.ROOT-SERVERS.NET ok "OK" ( INET 192.33.4.12 )
- D.ROOT-SERVERS.NET ok "OK" ( INET 128.8.10.90 )
- E.ROOT-SERVERS.NET ok "OK" ( INET 192.203.230.10 )
- I.ROOT-SERVERS.NET ok "OK" ( INET 192.36.148.17 )
- F.ROOT-SERVERS.NET ok "OK" ( INET 192.5.5.241 )
+ G.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.112.36.4 )
+ J.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.41.0.10 )
+ K.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 193.0.14.129 )
+ L.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.32.64.12 )
+ M.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 202.12.27.33 )
+ A.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.41.0.4 )
+ H.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.63.2.53 )
+ B.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.9.0.107 )
+ C.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.33.4.12 )
+ D.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.8.10.90 )
+ E.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.203.230.10 )
+ I.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.36.148.17 )
+ F.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.5.5.241 )
. flags 1 type PTR(checked): No such data; nrrs=0; cname=$; owner=$; ttl=598
. flags 1 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=598
. flags 1 type SOA(822): OK; nrrs=1; cname=$; owner=$; ttl=46580
const char *adns_strerror(adns_status st);
const char *adns_errabbrev(adns_status st);
+const char *adns_errtypeabbrev(adns_status st);
/* Like strerror but for adns_status values. adns_errabbrev returns
* the abbreviation of the error - eg, for adns_s_timeout it returns
- * "timeout". You MUST NOT call these functions with status values
+ * "timeout". adns_errtypeabbrev returns the abbreviation of the
+ * error class: ie, for values up to adns_s_max_XXX it will return the
+ * string XXX. You MUST NOT call these functions with status values
* not returned by the same adns library.
*/
return st;
}
+
#define SINFO(n,s) { adns_s_##n, #n, s }
static const struct sinfo {
SINFO( querydomaintoolong, "Domain name is too long" ),
SINFO( nxdomain, "No such domain" ),
- SINFO( nodata, "No such data" ),
+ SINFO( nodata, "No such data" )
};
static int si_compar(const void *key, const void *elem) {
return si->abbrev;
}
+
+#define STINFO(max) { adns_s_max_##max, #max }
+
+static const struct stinfo {
+ adns_status stmax;
+ const char *abbrev;
+} stinfos[]= {
+ { adns_s_ok, "ok" },
+ STINFO( localfail ),
+ STINFO( remotefail ),
+ STINFO( tempfail ),
+ STINFO( misconfig ),
+ STINFO( misquery ),
+ STINFO( permfail )
+};
+
+static int sti_compar(const void *key, const void *elem) {
+ const adns_status *st= key;
+ const struct stinfo *sti= elem;
+
+ adns_status here, min, max;
+
+ here= *st;
+ min= (sti==stinfos) ? 0 : sti[-1].stmax+1;
+ max= sti->stmax;
+
+ return here < min ? -1 : here > max ? 1 : 0;
+}
+
+const char *adns_errtypeabbrev(adns_status st) {
+ const struct stinfo *sti;
+
+ sti= bsearch(&st,stinfos,sizeof(stinfos)/sizeof(*stinfos),sizeof(*stinfos),sti_compar);
+ return sti->abbrev;
+}
+
+
void adns__isort(void *array, int nobjs, int sz, void *tempbuf,
int (*needswap)(void *context, const void *a, const void *b),
void *context) {
static adns_status csp_hostaddr(vbuf *vb, const adns_rr_hostaddr *rrp) {
const char *errstr;
adns_status st;
+ char buf[20];
int i;
st= csp_domain(vb,rrp->host); if (st) return st;
CSP_ADDSTR(" ");
- CSP_ADDSTR(adns_errabbrev(rrp->astatus));
+ CSP_ADDSTR(adns_errtypeabbrev(rrp->astatus));
+
+ sprintf(buf," %d ",rrp->astatus);
+ CSP_ADDSTR(buf);
+ CSP_ADDSTR(adns_errabbrev(rrp->astatus));
CSP_ADDSTR(" ");
+
errstr= adns_strerror(rrp->astatus);
st= csp_qstring(vb,errstr,strlen(errstr)); if (st) return st;