X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/828d89bd4196ad8ef825cdf2db26afe2eb797b69..620c146da30a20c2d9a6c572fdd0540558039d0e:/client/adnstest.c diff --git a/client/adnstest.c b/client/adnstest.c index 95955cb..52344d1 100644 --- a/client/adnstest.c +++ b/client/adnstest.c @@ -3,7 +3,7 @@ * - simple test program, not part of the library */ /* - * This file is part of adns, which is Copyright (C) 1997, 1998 Ian Jackson + * This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,28 +21,49 @@ */ #include +#include #include #include #include +#include + +#ifndef OUTPUTSTREAM +# define OUTPUTSTREAM stdout +#endif #include "adns.h" -static void failure(const char *what, adns_status st) { +static void failure_status(const char *what, adns_status st) { fprintf(stderr,"adns failure: %s: %s\n",what,adns_strerror(st)); exit(2); } +static void failure_errno(const char *what, int errnoval) { + fprintf(stderr,"adns failure: %s: errno=%d\n",what,errnoval); + exit(2); +} + static const char *defaultargv[]= { "ns.chiark.greenend.org.uk", 0 }; 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_rp_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 }; @@ -52,61 +73,95 @@ static void dumptype(adns_status ri, const char *rrtn, const char *fmtn) { ri ? " " : "", ri ? adns_strerror(ri) : ""); } +static void fdom_split(const char *fdom, const char **dom_r, int *qf_r, + char *ownflags, int ownflags_l) { + int qf; + char *ep; + + qf= strtoul(fdom,&ep,0); + if (*ep == ',' && strchr(ep,'/')) { + ep++; + while (*ep != '/') { + if (--ownflags_l <= 0) { fputs("too many flags\n",stderr); exit(3); } + *ownflags++= *ep++; + } + } + if (*ep != '/') { *dom_r= fdom; *qf_r= 0; } + else { *dom_r= ep+1; *qf_r= qf; } + *ownflags= 0; +} + int main(int argc, char *const *argv) { adns_state ads; adns_query *qus, qu; adns_answer *ans; - const char *rrtn, *fmtn, *const *domlist; + const char *initstring, *rrtn, *fmtn; + const char *const *fdomlist, *domain; char *show, *cp; - int len, i, qc, qi, tc, ti, ch; + int len, i, qc, qi, tc, ti, ch, qflags; adns_status r, ri; const adns_rrtype *types; + struct timeval now; adns_rrtype *types_a; + char ownflags[10]; + 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); + types_a= malloc(sizeof(*types_a)*(tc+1)); if (!types_a) { perror("malloc types"); exit(3); } for (cp= argv[1]+1, ti=0; ti,...] [ ...]",stderr); + if (ch != ',') { + fputs("usage: dtest [/] [:,...] [ ...]\n",stderr); exit(4); } cp++; } } + *cp++= adns_r_none; types= types_a; argv++; } else { types= defaulttypes; } - if (argv[0] && argv[1]) domlist= (const char *const*)argv+1; - else domlist= defaultargv; + if (argv[0] && argv[1]) fdomlist= (const char *const*)argv+1; + else fdomlist= defaultargv; - for (qc=0; qc[domlist]; qc++); + for (qc=0; fdomlist[qc]; 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 (r) failure("init",r); + 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_errno("init",r); for (qi=0; qitype, &rrtn,&fmtn,&len, 0,0); - fprintf(stdout, "%s type ", domlist[qi]); + fprintf(stdout, "%s flags %d type ",domain,qflags); dumptype(ri,rrtn,fmtn); - fprintf(stdout, ": %s; nrrs=%d; cname=%s\n", - adns_strerror(ans->status), - ans->nrrs, ans->cname ? ans->cname : "$"); + fprintf(stdout, "%s%s: %s; nrrs=%d; cname=%s; owner=%s; ttl=%ld\n", + ownflags[0] ? " ownflags=" : "", ownflags, + strchr(ownflags,'a') ? adns_errabbrev(ans->status) + : adns_strerror(ans->status), + ans->nrrs, + ans->cname ? ans->cname : "$", + ans->owner ? ans->owner : "$", + (long)ans->expires - (long)now.tv_sec); 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); + r= adns_rr_info(ans->type, 0,0,0, ans->rrs.bytes + i*len, &show); + if (r) failure_status("info",r); + fprintf(stdout," %s\n",show); free(show); } } @@ -140,5 +205,7 @@ int main(int argc, char *const *argv) { } free(qus); + adns_finish(ads); + exit(0); }