* _mailbox (pap,csp +pap_mailbox822)
* _rp (pa,cs)
* _soa (pa,mf,cs)
- * _srv* (qdpl,(pap),pa*2,mf*2,di,(csp),cs*2,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_*
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;
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;
return;
}
- queried= &parent->ctx.info.ptr_parent_addr;
+ queried= &parent->ctx.tinfo.ptr_addr;
for (i=0, found=cans->rrs.addr; i<cans->nrrs; i++, found++) {
if (queried->len == found->len &&
!memcmp(&queried->addr,&found->addr,queried->len)) {
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,
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);
}
/*
- * _srv* (qdpl,(pap),pa*2,mf*2,di,(csp),cs*2,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,
#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;