X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/ae8cc9775a6eb23901a89a2604f73525b0553db8..96b22fa55f7e24d3de4735b89e86cf009e48348e:/src/transmit.c diff --git a/src/transmit.c b/src/transmit.c index 7afb90f..be72cf2 100644 --- a/src/transmit.c +++ b/src/transmit.c @@ -74,11 +74,10 @@ static adns_status mkquery_footer(vbuf *vb, adns_rrtype type) { return adns_s_ok; } -adns_status adns__qdpl_normal(adns_state ads, - const char **p_io, const char *pe, int labelnum, - char label_r[], int *ll_io, - adns_queryflags flags, - const typeinfo *typei) { +static adns_status qdparselabel(adns_state ads, + const char **p_io, const char *pe, + char label_r[], int *ll_io, + adns_queryflags flags) { int ll, c; const char *p; @@ -102,13 +101,6 @@ adns_status adns__qdpl_normal(adns_state ads, return adns_s_querydomaininvalid; } } - if (!(flags & adns_qf_quoteok_query)) { - if (c == '-') { - if (!ll) return adns_s_querydomaininvalid; - } else if (!ctype_alpha(c) && !ctype_digit(c)) { - return adns_s_querydomaininvalid; - } - } if (ll == *ll_io) return adns_s_querydomaininvalid; label_r[ll++]= c; } @@ -122,7 +114,7 @@ adns_status adns__mkquery(adns_state ads, vbuf *vb, int *id_r, const char *owner, int ol, const typeinfo *typei, adns_rrtype type, adns_queryflags flags) { - int labelnum, ll, nbytes; + int ll, nbytes; byte label[255]; byte *rqp; const char *p, *pe; @@ -134,10 +126,9 @@ adns_status adns__mkquery(adns_state ads, vbuf *vb, int *id_r, p= owner; pe= owner+ol; nbytes= 0; - labelnum= 0; while (p!=pe) { ll= sizeof(label); - st= typei->qdparselabel(ads, &p,pe, labelnum++, label, &ll, flags, typei); + st= qdparselabel(ads, &p,pe, label, &ll, flags); if (st) return st; if (!ll) return adns_s_querydomaininvalid; if (ll > DNS_MAXLABEL) return adns_s_querydomaintoolong; @@ -249,10 +240,18 @@ static void query_usetcp(adns_query qu, struct timeval now) { adns__tcp_tryconnect(qu->ads,now); } +struct udpsocket *adns__udpsocket_by_af(adns_state ads, int af) { + int i; + for (i=0; inudp; i++) + if (ads->udpsocket[i].af == af) return &ads->udpsocket[i]; + return 0; +} + void adns__query_send(adns_query qu, struct timeval now) { - struct sockaddr_in servaddr; int serv, r; adns_state ads; + struct udpsocket *udp; + adns_rr_addr *addr; assert(qu->state == query_tosend); if ((qu->flags & adns_qf_usevc) || (qu->query_dglen > DNS_MAXUDP)) { @@ -265,16 +264,14 @@ void adns__query_send(adns_query qu, struct timeval now) { return; } - serv= qu->udpnextserver; - memset(&servaddr,0,sizeof(servaddr)); - ads= qu->ads; - servaddr.sin_family= AF_INET; - servaddr.sin_addr= ads->servers[serv].addr; - servaddr.sin_port= htons(DNS_PORT); + serv= qu->udpnextserver; + addr= &ads->servers[serv]; + udp= adns__udpsocket_by_af(ads, addr->addr.sa.sa_family); + assert(udp); - r= sendto(ads->udpsocket,qu->query_dgram,qu->query_dglen,0, - (const struct sockaddr*)&servaddr,sizeof(servaddr)); + r= sendto(udp->fd,qu->query_dgram,qu->query_dglen,0, + &addr->addr.sa,addr->len); if (r<0 && errno == EMSGSIZE) { qu->retries= 0; query_usetcp(qu,now);