+ qu->id= id;
+ qu->query_dglen= qu->vb.used;
+ memcpy(qu->query_dgram,qu->vb.buf,qu->vb.used);
+
+ typei->query_send(qu,now);
+}
+
+adns_status adns__ckl_hostname(adns_state ads, adns_queryflags flags,
+ union checklabel_state *cls,
+ qcontext *ctx, int labnum,
+ const char *label, int lablen)
+{
+ int i, c;
+
+ if (flags & adns_qf_quoteok_query) return adns_s_ok;
+ for (i=0; i<lablen; i++) {
+ c= label[i];
+ if (c == '-') {
+ if (!i) return adns_s_querydomaininvalid;
+ } else if (!ctype_alpha(c) && !ctype_digit(c)) {
+ return adns_s_querydomaininvalid;
+ }
+ }
+ return adns_s_ok;
+}
+
+static adns_status check_domain_name(adns_state ads, adns_queryflags flags,
+ qcontext *ctx, const typeinfo *typei,
+ const byte *dgram, int dglen)
+{
+ findlabel_state fls;
+ adns_status err;
+ int labnum= 0, labstart, lablen;
+ union checklabel_state cls;
+
+ adns__findlabel_start(&fls,ads, -1,0, dgram,dglen,dglen, DNS_HDRSIZE,0);
+ do {
+ err= adns__findlabel_next(&fls, &lablen,&labstart);
+ assert(!err); assert(lablen >= 0);
+ err= typei->checklabel(ads,flags, &cls,ctx,
+ labnum++, dgram+labstart,lablen);
+ if (err) return err;
+ } while (lablen);
+ return adns_s_ok;
+}
+
+adns_status adns__internal_submit(adns_state ads, adns_query *query_r,
+ adns_query parent,
+ const typeinfo *typei, adns_rrtype type,
+ vbuf *qumsg_vb, int id,
+ adns_queryflags flags, struct timeval now,
+ qcontext *ctx) {
+ adns_query qu;
+ adns_status err;
+
+ err= check_domain_name(ads, flags,ctx,typei, qumsg_vb->buf,qumsg_vb->used);
+ if (err) goto x_err;
+ qu= query_alloc(ads,typei,type,flags,now);
+ if (!qu) { err = adns_s_nomemory; goto x_err; }
+ *query_r= qu;
+
+ qu->parent= parent;
+ LIST_LINK_TAIL_PART(parent->children,qu,siblings.);
+ memcpy(&qu->ctx,ctx,sizeof(qu->ctx));
+ query_submit(ads,qu, typei,qumsg_vb,id,flags,now);
+
+ return adns_s_ok;
+
+x_err:
+ adns__vbuf_free(qumsg_vb);
+ return err;
+}
+
+static void query_simple(adns_state ads, adns_query qu,
+ const char *owner, int ol,
+ const typeinfo *typei, adns_queryflags flags,
+ struct timeval now) {
+ vbuf vb_new;
+ int id;
+ adns_status stat;
+
+ stat= adns__mkquery(ads,&qu->vb,&id, owner,ol,
+ typei,qu->answer->type, flags);
+ if (stat) {
+ if (stat == adns_s_querydomaintoolong && (flags & adns_qf_search)) {
+ adns__search_next(ads,qu,now);
+ return;
+ } else {
+ adns__query_fail(qu,stat);
+ return;
+ }
+ }