X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/e35d8cca241a9c6397c32ba42e7dbb045887c2e7..9964d8052f8415c96ee1f66723fde3eeab5fe77a:/src/query.c diff --git a/src/query.c b/src/query.c index 71d635d..cd04944 100644 --- a/src/query.c +++ b/src/query.c @@ -109,21 +109,67 @@ static void query_submit(adns_state ads, adns_query qu, else adns__query_send(qu, now); } +adns_status adns__ckl_hostname(adns_state ads, adns_queryflags flags, + union checklabel_state *css, + 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= 0); + err= typei->checklabel(ads,flags, &css,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, const typeinfo *typei, adns_rrtype type, vbuf *qumsg_vb, int id, adns_queryflags flags, struct timeval now, - const qcontext *ctx) { + 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) { adns__vbuf_free(qumsg_vb); return adns_s_nomemory; } + if (!qu) { err = adns_s_nomemory; goto x_err; } *query_r= qu; 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, @@ -146,6 +192,9 @@ static void query_simple(adns_state ads, adns_query qu, } } + stat= check_domain_name(ads, flags,&qu->ctx,typei, qu->vb.buf,qu->vb.used); + if (stat) { adns__query_fail(qu,stat); return; } + vb_new= qu->vb; adns__vbuf_init(&qu->vb); query_submit(ads,qu, typei,&vb_new,id, flags,now); @@ -276,8 +325,6 @@ int adns_submit(adns_state ads, return r; } -static const char *default_zone = ""; - int adns_submit_reverse_any(adns_state ads, const struct sockaddr *addr, const char *zone, @@ -285,40 +332,15 @@ int adns_submit_reverse_any(adns_state ads, adns_queryflags flags, void *context, adns_query *query_r) { - char *buf, *buf_free, *p; + char *buf, *buf_free = 0; char shortbuf[100]; - const afinfo *ai; - int r, lreq; + int r; flags &= ~adns_qf_search; - switch (addr->sa_family) { - case AF_INET: - ai = &adns__inet_afinfo; - if (zone == default_zone) zone = "in-addr.arpa"; - break; - case AF_INET6: - ai = &adns__inet6_afinfo; - if (zone == default_zone) zone = "ip6.arpa"; - break; - default: - return ENOSYS; - } - - lreq= strlen(zone) + ai->nrevcomp*(ai->revcompwd + 1) + 1; - if (lreq > sizeof(shortbuf)) { - buf= malloc(lreq); - if (!buf) return errno; - buf_free= buf; - } else { - buf= shortbuf; - buf_free= 0; - } - - p = ai->rev_mkname(addr, buf); - *p++ = '.'; - strcpy(p, zone); - + buf = shortbuf; + r= adns__make_reverse_domain(addr,zone, &buf,sizeof(shortbuf),&buf_free); + if (r) return r; r= adns_submit(ads,buf,type,flags,context,query_r); free(buf_free); return r; @@ -331,8 +353,7 @@ int adns_submit_reverse(adns_state ads, void *context, adns_query *query_r) { if (type != adns_r_ptr && type != adns_r_ptr_raw) return EINVAL; - return adns_submit_reverse_any(ads,addr,default_zone, - type,flags,context,query_r); + return adns_submit_reverse_any(ads,addr,0,type,flags,context,query_r); } int adns_synchronous(adns_state ads,