X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftypes.c;h=675442c3344d6c878a94c5e7fa03aec0c8b113ff;hb=898afc783a7bd5947405b4fd828a34dfbd9b99a8;hp=463d6fc71571e107d2465caa1a8e706af8f36c23;hpb=2fe563002163cb581f6656385a71e398459323d4;p=adns.git diff --git a/src/types.c b/src/types.c index 463d6fc..675442c 100644 --- a/src/types.c +++ b/src/types.c @@ -47,28 +47,31 @@ * _intstr (mf,csp,cs) * _manyistr (mf,cs) * _txt (pa) - * _inaddr (pa,dip,di) - * _addr (pa,di,csp,cs) - * _domain (pap) + * _inaddr (pa,dip,di,cs +search_sortlist) + * _addr (pa,di,div,csp,cs) + * _domain (pap,csp,cs) + * _dom_raw (pa) * _host_raw (pa) - * _hostaddr (pap,pa,dip,di,mfp,mf,csp,cs +pap_findaddrs) + * _hostaddr (pap,pa,dip,di,mfp,mf,csp,cs + * +pap_findaddrs, icb_hostaddr) * _mx_raw (pa,di) * _mx (pa,di) * _inthostaddr (mf,cs) + * _inthost (cs) * _ptr (pa) - * _strpair (mf,cs) - * _intstrpair (mf,cs) + * _strpair (mf) + * _intstrpair (mf) * _hinfo (pa) - * _mailbox (pap +pap_mailbox822) - * _rp (pa) + * _mailbox (pap,csp +pap_mailbox822) + * _rp (pa,cs) * _soa (pa,mf,cs) - * _srv* (qdpl,(pap),pa,mf,di,(csp),cs,postsort) + * _srv* (ckl,(pap),pa*2,mf*2,di,(csp),cs*2,postsort) * _byteblock (mf) * _opaque (pa,cs) * _flat (mf) * * within each section: - * qdpl_* + * ckl_* * pap_* * pa_* * dip_* @@ -239,7 +242,7 @@ static adns_status cs_hinfo(vbuf *vb, const void *datap) { } /* - * _inaddr (pa,dip,di) + * _inaddr (pa,dip,di,cs +search_sortlist) */ static adns_status pa_inaddr(const parseinfo *pai, int cbyte, @@ -289,7 +292,7 @@ static adns_status cs_inaddr(vbuf *vb, const void *datap) { } /* - * _addr (pa,di,csp,cs) + * _addr (pa,di,div,csp,cs) */ static adns_status pa_addr(const parseinfo *pai, int cbyte, @@ -408,7 +411,7 @@ static adns_status pa_host_raw(const parseinfo *pai, int cbyte, } /* - * _hostaddr (pap,pa,dip,di,mfp,mf,csp,cs +icb_hostaddr, pap_findaddrs) + * _hostaddr (pap,pa,dip,di,mfp,mf,csp,cs +pap_findaddrs, icb_hostaddr) */ static adns_status pap_findaddrs(const parseinfo *pai, adns_rr_hostaddr *ha, @@ -453,7 +456,7 @@ static adns_status pap_findaddrs(const parseinfo *pai, adns_rr_hostaddr *ha, static void icb_hostaddr(adns_query parent, adns_query child) { adns_answer *cans= child->answer; - adns_rr_hostaddr *rrp= child->ctx.info.hostaddr; + adns_rr_hostaddr *rrp= child->ctx.pinfo.hostaddr; adns_state ads= parent->ads; adns_status st; @@ -507,7 +510,8 @@ static adns_status pap_hostaddr(const parseinfo *pai, int *cbyte_io, ctx.ext= 0; ctx.callback= icb_hostaddr; - ctx.info.hostaddr= rrp; + ctx.pinfo.hostaddr= rrp; + memset(&ctx.tinfo, 0, sizeof(ctx.tinfo)); nflags= adns_qf_quoteok_query; if (!(pai->qu->flags & adns_qf_cname_loose)) nflags |= adns_qf_cname_forbid; @@ -717,7 +721,7 @@ static void icb_ptr(adns_query parent, adns_query child) { return; } - queried= &parent->ctx.info.ptr_parent_addr; + queried= &parent->ctx.tinfo.ptr_addr; for (i=0, found=cans->rrs.addr; inrrs; i++, found++) { if (queried->len == found->len && !memcmp(&queried->addr,&found->addr,queried->len)) { @@ -755,7 +759,7 @@ static adns_status pa_ptr(const parseinfo *pai, int dmstart, if (st) return st; if (cbyte != max) return adns_s_invaliddata; - ap= &pai->qu->ctx.info.ptr_parent_addr; + ap= &pai->qu->ctx.tinfo.ptr_addr; if (!ap->len) { adns__findlabel_start(&fls, pai->ads, -1, pai->qu, pai->qu->query_dgram, pai->qu->query_dglen, @@ -794,7 +798,8 @@ static adns_status pa_ptr(const parseinfo *pai, int dmstart, ctx.ext= 0; ctx.callback= icb_ptr; - memset(&ctx.info,0,sizeof(ctx.info)); + memset(&ctx.pinfo,0,sizeof(ctx.pinfo)); + memset(&ctx.tinfo,0,sizeof(ctx.tinfo)); st= adns__internal_submit(pai->ads, &nqu, adns__findtype(adns_r_addr), &pai->qu->vb, id, adns_qf_quoteok_query, pai->now, &ctx); @@ -848,7 +853,7 @@ static adns_status pa_hinfo(const parseinfo *pai, int cbyte, } /* - * _mailbox (pap,cs) + * _mailbox (pap,cs +pap_mailbox822) */ static adns_status pap_mailbox822(const parseinfo *pai, @@ -1005,36 +1010,17 @@ static adns_status cs_soa(vbuf *vb, const void *datap) { } /* - * _srv* (pa*2,di,cs*2,qdpl,postsort) + * _srv* (ckl,(pap),pa*2,mf*2,di,(csp),cs*2,postsort) */ -static adns_status qdpl_srv(adns_state ads, - const char **p_io, const char *pe, int labelnum, - char label_r[DNS_MAXDOMAIN], int *ll_io, - adns_queryflags flags, - const typeinfo *typei) { - int useflags; - const char *p_orig; - adns_status st; - - if (labelnum < 2 && !(flags & adns_qf_quoteok_query)) { - useflags= adns_qf_quoteok_query; - p_orig= *p_io; - } else { - useflags= flags; - p_orig= 0; - } - st= adns__qdpl_normal(ads, p_io,pe, labelnum,label_r, ll_io, useflags,typei); - if (st) return st; - - if (p_orig) { - int ll= *ll_io; - if (!ll || label_r[0]!='_') - return adns_s_querydomaininvalid; - if (memchr(p_orig+1, '\\', pe - (p_orig+1))) - return adns_s_querydomaininvalid; +static adns_status ckl_srv(adns_state ads, adns_queryflags flags, + union checklabel_state *cls, qcontext *ctx, + int labnum, const char *label, int lablen) { + if (labnum < 2 && !(flags & adns_qf_quoteok_query)) { + if (!lablen || label[0] != '_') return adns_s_querydomaininvalid; + return adns_s_ok; } - return adns_s_ok; + return adns__ckl_hostname(ads, flags, cls, ctx, labnum, label, lablen); } static adns_status pap_srv_begin(const parseinfo *pai, int *cbyte_io, int max, @@ -1245,45 +1231,46 @@ static void mf_flat(adns_query qu, void *data) { } #define TYPESZ_M(member) (sizeof(*((adns_answer*)0)->rrs.member)) -#define DEEP_TYPE(code,rrt,fmt,memb,parser,comparer,printer) \ - { adns_r_##code, rrt,fmt,TYPESZ_M(memb), mf_##memb, \ - printer,parser,comparer, adns__qdpl_normal,0 } -#define FLAT_TYPE(code,rrt,fmt,memb,parser,comparer,printer) \ - { adns_r_##code, rrt,fmt,TYPESZ_M(memb), mf_flat, \ - printer,parser,comparer, adns__qdpl_normal,0 } -#define XTRA_TYPE(code,rrt,fmt,memb,parser,comparer,printer,qdpl,postsort) \ - { adns_r_##code, rrt,fmt,TYPESZ_M(memb), mf_##memb, \ - printer,parser,comparer,qdpl,postsort } +#define DEEP_TYPE(code,rrt,fmt,memb,parser,comparer,/*printer*/...) \ + { adns_r_##code, rrt,fmt,TYPESZ_M(memb), mf_##memb, \ + GLUE(cs_, CAR(__VA_ARGS__)),pa_##parser,di_##comparer, \ + adns__ckl_hostname, CDR(__VA_ARGS__) } +#define FLAT_TYPE(code,rrt,fmt,memb,parser,comparer,/*printer*/...) \ + { adns_r_##code, rrt,fmt,TYPESZ_M(memb), mf_flat, \ + GLUE(cs_, CAR(__VA_ARGS__)),pa_##parser,di_##comparer, \ + adns__ckl_hostname, CDR(__VA_ARGS__) } + +#define di_0 0 static const typeinfo typeinfos[] = { /* Must be in ascending order of rrtype ! */ /* mem-mgmt code rrt fmt member parser comparer printer */ -FLAT_TYPE(a, "A", 0, inaddr, pa_inaddr, di_inaddr,cs_inaddr ), -DEEP_TYPE(ns_raw, "NS", "raw",str, pa_host_raw,0, cs_domain ), -DEEP_TYPE(cname, "CNAME", 0, str, pa_dom_raw, 0, cs_domain ), -DEEP_TYPE(soa_raw,"SOA", "raw",soa, pa_soa, 0, cs_soa ), -DEEP_TYPE(ptr_raw,"PTR", "raw",str, pa_host_raw,0, cs_domain ), -DEEP_TYPE(hinfo, "HINFO", 0, intstrpair,pa_hinfo, 0, cs_hinfo ), -DEEP_TYPE(mx_raw, "MX", "raw",intstr, pa_mx_raw, di_mx_raw,cs_inthost ), -DEEP_TYPE(txt, "TXT", 0, manyistr,pa_txt, 0, cs_txt ), -DEEP_TYPE(rp_raw, "RP", "raw",strpair, pa_rp, 0, cs_rp ), -XTRA_TYPE(srv_raw,"SRV", "raw",srvraw , pa_srvraw, di_srv, cs_srvraw, - qdpl_srv, postsort_srv), - -FLAT_TYPE(addr, "A", "addr", addr, pa_addr, di_addr, cs_addr ), -DEEP_TYPE(ns, "NS", "+addr",hostaddr,pa_hostaddr,di_hostaddr,cs_hostaddr ), -DEEP_TYPE(ptr, "PTR","checked",str, pa_ptr, 0, cs_domain ), -DEEP_TYPE(mx, "MX", "+addr",inthostaddr,pa_mx, di_mx, cs_inthostaddr), -XTRA_TYPE(srv, "SRV","+addr",srvha, pa_srvha, di_srv, cs_srvha, - qdpl_srv, postsort_srv), - -DEEP_TYPE(soa, "SOA","822", soa, pa_soa, 0, cs_soa ), -DEEP_TYPE(rp, "RP", "822", strpair, pa_rp, 0, cs_rp ), +FLAT_TYPE(a, "A", 0, inaddr, inaddr, inaddr,inaddr ), +DEEP_TYPE(ns_raw, "NS", "raw",str, host_raw,0, domain ), +DEEP_TYPE(cname, "CNAME", 0, str, dom_raw, 0, domain ), +DEEP_TYPE(soa_raw,"SOA", "raw",soa, soa, 0, soa ), +DEEP_TYPE(ptr_raw,"PTR", "raw",str, host_raw,0, domain ), +DEEP_TYPE(hinfo, "HINFO", 0, intstrpair,hinfo, 0, hinfo ), +DEEP_TYPE(mx_raw, "MX", "raw",intstr, mx_raw, mx_raw,inthost ), +DEEP_TYPE(txt, "TXT", 0, manyistr, txt, 0, txt ), +DEEP_TYPE(rp_raw, "RP", "raw",strpair, rp, 0, rp ), +DEEP_TYPE(srv_raw,"SRV", "raw",srvraw , srvraw, srv, srvraw, + .checklabel= ckl_srv, .postsort= postsort_srv), + +FLAT_TYPE(addr, "A", "addr", addr, addr, addr, addr ), +DEEP_TYPE(ns, "NS", "+addr",hostaddr, hostaddr,hostaddr,hostaddr ), +DEEP_TYPE(ptr, "PTR","checked",str, ptr, 0, domain ), +DEEP_TYPE(mx, "MX", "+addr",inthostaddr,mx, mx, inthostaddr, ), +DEEP_TYPE(srv, "SRV","+addr",srvha, srvha, srv, srvha, + .checklabel= ckl_srv, .postsort= postsort_srv), + +DEEP_TYPE(soa, "SOA","822", soa, soa, 0, soa ), +DEEP_TYPE(rp, "RP", "822", strpair, rp, 0, rp ), }; static const typeinfo typeinfo_unknown= -DEEP_TYPE(unknown,0, "unknown",byteblock,pa_opaque, 0, cs_opaque ); +DEEP_TYPE(unknown,0, "unknown",byteblock,opaque, 0, opaque ); const typeinfo *adns__findtype(adns_rrtype type) { const typeinfo *begin, *end, *mid;