X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftypes.c;h=59e9502e2f60f7072d4281479f8c69a14df1c576;hb=fc440c64836370db9d8cb1a25f09c9df0786f865;hp=65b9065947c7150b84051166320ce571bf06b6b2;hpb=37792aacaf7abbcdac6a02715a5ef794b5147f13;p=adns.git diff --git a/src/types.c b/src/types.c index 65b9065..59e9502 100644 --- a/src/types.c +++ b/src/types.c @@ -4,7 +4,7 @@ */ /* * This file is part of adns, which is - * Copyright (C) 1997-2000,2003,2006,2014-2016 Ian Jackson + * Copyright (C) 1997-2000,2003,2006,2014-2016,2020 Ian Jackson * Copyright (C) 2014 Mark Wooding * Copyright (C) 1999-2000,2003,2006 Tony Finch * Copyright (C) 1991 Massachusetts Institute of Technology @@ -221,7 +221,7 @@ static adns_status pa_txt(const parseinfo *pai, int cbyte, return adns_s_ok; } -static adns_status cs_txt(vbuf *vb, const void *datap) { +static adns_status cs_txt(vbuf *vb, adns_rrtype rrt, const void *datap) { const adns_rr_intstr *const *rrp= datap; const adns_rr_intstr *current; adns_status st; @@ -238,7 +238,7 @@ static adns_status cs_txt(vbuf *vb, const void *datap) { * _hinfo (cs) */ -static adns_status cs_hinfo(vbuf *vb, const void *datap) { +static adns_status cs_hinfo(vbuf *vb, adns_rrtype rrt, const void *datap) { const adns_rr_intstrpair *rrp= datap; adns_status st; @@ -316,7 +316,7 @@ static adns_status csp_genaddr(vbuf *vb, int af, const void *p) { return adns_s_ok; } -static adns_status cs_inaddr(vbuf *vb, const void *datap) { +static adns_status cs_inaddr(vbuf *vb, adns_rrtype rrt, const void *datap) { return csp_genaddr(vb, AF_INET,datap); } @@ -338,7 +338,7 @@ static int di_in6addr(adns_state ads, return dip_genaddr(ads,AF_INET6,datap_a,datap_b); } -static adns_status cs_in6addr(vbuf *vb, const void *datap) { +static adns_status cs_in6addr(vbuf *vb, adns_rrtype rrt, const void *datap) { return csp_genaddr(vb,AF_INET6,datap); } @@ -499,7 +499,7 @@ static adns_status csp_addr(vbuf *vb, const adns_rr_addr *rrp) { return adns_s_ok; } -static adns_status cs_addr(vbuf *vb, const void *datap) { +static adns_status cs_addr(vbuf *vb, adns_rrtype rrt, const void *datap) { const adns_rr_addr *rrp= datap; return csp_addr(vb,rrp); @@ -785,7 +785,7 @@ static adns_status csp_domain(vbuf *vb, const char *domain) { return adns_s_ok; } -static adns_status cs_domain(vbuf *vb, const void *datap) { +static adns_status cs_domain(vbuf *vb, adns_rrtype rrt, const void *datap) { const char *const *domainp= datap; return csp_domain(vb,*domainp); } @@ -838,6 +838,7 @@ static adns_status pap_findaddrs(const parseinfo *pai, adns_rr_hostaddr *ha, &type, &class, &ttl, &rdlen, &rdstart, pai->dgram, pai->dglen, dmstart, &ownermatched); if (st) return st; + if (type==-1) continue; if (!ownermatched || class != DNS_CLASS_IN) continue; typef= addr_rrtypeflag(type); if (!(want & typef)) continue; @@ -1000,11 +1001,13 @@ static void mf_hostaddr(adns_query qu, void *datap) { mfp_hostaddr(qu,rrp); } -static adns_status csp_hostaddr(vbuf *vb, const adns_rr_hostaddr *rrp) { +static adns_status csp_hostaddr(vbuf *vb, adns_rrtype rrt, + const adns_rr_hostaddr *rrp) { const char *errstr; adns_status st; char buf[20]; int i; + size_t addrsz= gsz_addr(0, rrt); st= csp_domain(vb,rrp->host); if (st) return st; @@ -1024,7 +1027,7 @@ static adns_status csp_hostaddr(vbuf *vb, const adns_rr_hostaddr *rrp) { CSP_ADDSTR(" ("); for (i=0; inaddrs; i++) { CSP_ADDSTR(" "); - st= csp_addr(vb,&rrp->addrs[i]); + st= csp_addr(vb, (const void*)((const char*)rrp->addrs + addrsz*i)); } CSP_ADDSTR(" )"); } else { @@ -1033,10 +1036,10 @@ static adns_status csp_hostaddr(vbuf *vb, const adns_rr_hostaddr *rrp) { return adns_s_ok; } -static adns_status cs_hostaddr(vbuf *vb, const void *datap) { +static adns_status cs_hostaddr(vbuf *vb, adns_rrtype rrt, const void *datap) { const adns_rr_hostaddr *rrp= datap; - return csp_hostaddr(vb,rrp); + return csp_hostaddr(vb,rrt,rrp); } /* @@ -1120,19 +1123,19 @@ static adns_status csp_intofinthost(vbuf *vb, int i) { return adns_s_ok; } -static adns_status cs_inthostaddr(vbuf *vb, const void *datap) { +static adns_status cs_inthostaddr(vbuf *vb, adns_rrtype rrt, const void *datap) { const adns_rr_inthostaddr *rrp= datap; adns_status st; st = csp_intofinthost(vb,rrp->i); if (st) return st; - return csp_hostaddr(vb,&rrp->ha); + return csp_hostaddr(vb,rrt,&rrp->ha); } /* * _inthost (cs) */ -static adns_status cs_inthost(vbuf *vb, const void *datap) { +static adns_status cs_inthost(vbuf *vb, adns_rrtype rrt, const void *datap) { const adns_rr_intstr *rrp= datap; adns_status st; @@ -1360,7 +1363,7 @@ static adns_status pa_rp(const parseinfo *pai, int cbyte, return adns_s_ok; } -static adns_status cs_rp(vbuf *vb, const void *datap) { +static adns_status cs_rp(vbuf *vb, adns_rrtype rrt, const void *datap) { const adns_rr_strpair *rrp= datap; adns_status st; @@ -1406,7 +1409,7 @@ static void mf_soa(adns_query qu, void *datap) { adns__makefinal_str(qu,&rrp->rname); } -static adns_status cs_soa(vbuf *vb, const void *datap) { +static adns_status cs_soa(vbuf *vb, adns_rrtype rrt, const void *datap) { const adns_rr_soa *rrp= datap; char buf[20]; int i; @@ -1516,7 +1519,7 @@ static adns_status csp_srv_begin(vbuf *vb, const adns_rr_srvha *rrp return adns_s_ok; } -static adns_status cs_srvraw(vbuf *vb, const void *datap) { +static adns_status cs_srvraw(vbuf *vb, adns_rrtype rrt, const void *datap) { const adns_rr_srvraw *rrp= datap; adns_status st; @@ -1524,12 +1527,12 @@ static adns_status cs_srvraw(vbuf *vb, const void *datap) { return csp_domain(vb,rrp->host); } -static adns_status cs_srvha(vbuf *vb, const void *datap) { +static adns_status cs_srvha(vbuf *vb, adns_rrtype rrt, const void *datap) { const adns_rr_srvha *rrp= datap; adns_status st; st= csp_srv_begin(vb,(const void*)datap); if (st) return st; - return csp_hostaddr(vb,&rrp->ha); + return csp_hostaddr(vb,rrt,&rrp->ha); } static void postsort_srv(adns_state ads, void *array, int nrrs,int rrsz, @@ -1620,7 +1623,7 @@ static adns_status pa_opaque(const parseinfo *pai, int cbyte, return adns_s_ok; } -static adns_status cs_opaque(vbuf *vb, const void *datap) { +static adns_status cs_opaque(vbuf *vb, adns_rrtype rrt, const void *datap) { const adns_rr_byteblock *rrp= datap; char buf[10]; int l;