X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/ffbda80c54147d112c125f208f6611daf09358b3..12c5b204145993a34b92ac2b7de5ebcebb6d2d15:/client/adnstest.c diff --git a/client/adnstest.c b/client/adnstest.c index 56cf45f..a7e631e 100644 --- a/client/adnstest.c +++ b/client/adnstest.c @@ -25,6 +25,10 @@ #include #include +#ifndef OUTPUTSTREAM +# define OUTPUTSTREAM stdout +#endif + #include "adns.h" static void failure(const char *what, adns_status st) { @@ -38,60 +42,122 @@ static const adns_rrtype defaulttypes[]= { adns_r_a, adns_r_ns_raw, adns_r_cname, + adns_r_soa_raw, adns_r_ptr_raw, + adns_r_hinfo, + adns_r_mx_raw, + adns_r_txt, + adns_r_rp_raw, + + adns_r_addr, + adns_r_ns, + adns_r_ptr, + adns_r_mx, + + adns_r_soa, + adns_r_rp, + adns_r_none }; -int main(int argc, const char *const *argv) { +static void dumptype(adns_status ri, const char *rrtn, const char *fmtn) { + fprintf(stdout, "%s(%s)%s%s", + ri ? "?" : rrtn, ri ? "?" : fmtn ? fmtn : "-", + ri ? " " : "", ri ? adns_strerror(ri) : ""); +} + +int main(int argc, char *const *argv) { adns_state ads; adns_query *qus, qu; adns_answer *ans; - const char *rrtn, *fmtn; - char *show; - int len, i, qc, qi, tc, ti; + const char *initstring, *rrtn, *fmtn; + const char *const *domlist; + char *show, *cp; + int len, i, qc, qi, tc, ti, ch; adns_status r, ri; const adns_rrtype *types; + adns_rrtype *types_a; - if (argv[0] && argv[1]) argv++; - else argv= defaultargv; - - types= defaulttypes; + if (argv[0] && argv[1] && argv[1][0] == '/') { + initstring= argv[1]+1; + argv++; + } else { + initstring= 0; + } + + if (argv[0] && argv[1] && argv[1][0] == ':') { + for (cp= argv[1]+1, tc=1; (ch= *cp); cp++) + if (ch==',') tc++; + types_a= malloc(sizeof(*types_a)*tc); + if (!types_a) { perror("malloc types"); exit(3); } + for (cp= argv[1]+1, ti=0; ti] [:,...] [ ...]\n",stderr); + exit(4); + } + cp++; + } + } + types= types_a; + argv++; + } else { + types= defaulttypes; + } + + if (argv[0] && argv[1]) domlist= (const char *const*)argv+1; + else domlist= defaultargv; - for (qc=0; qc[argv]; qc++); + for (qc=0; qc[domlist]; qc++); for (tc=0; types[tc] != adns_r_none; tc++); qus= malloc(sizeof(qus)*qc*tc); if (!qus) { perror("malloc qus"); exit(3); } - r= adns_init(&ads,adns_if_debug|adns_if_noautosys,0); + if (initstring) { + r= adns_init_strcfg(&ads,adns_if_debug|adns_if_noautosys,stdout,initstring); + } else { + r= adns_init(&ads,adns_if_debug|adns_if_noautosys,0); + } if (r) failure("init",r); for (qi=0; qitype, &rrtn,&fmtn,&len, 0,0); - fprintf(stdout, "%s: %s; nrrs=%d; cname=%s; ", - argv[qi], adns_strerror(ans->status), + fprintf(stdout, "%s type ", domlist[qi]); + dumptype(ri,rrtn,fmtn); + fprintf(stdout, ": %s; nrrs=%d; cname=%s\n", + adns_strerror(ans->status), ans->nrrs, ans->cname ? ans->cname : "$"); - fprintf(stdout, "type %s(%s) %s\n", - ri ? "?" : rrtn, ri ? "?" : fmtn ? fmtn : "-", - adns_strerror(ri)); if (ans->nrrs) { assert(!ri); for (i=0; inrrs; i++) { r= adns_rr_info(ans->type, 0,0,0, ans->rrs.bytes+i*len,&show); if (r) failure("info",r); - printf(" %s\n",show); + fprintf(stdout," %s\n",show); free(show); } } @@ -100,5 +166,7 @@ int main(int argc, const char *const *argv) { } free(qus); + adns_finish(ads); + exit(0); }