+
+ if (qu->udpretries >= UDPMAXRETRIES) {
+ adns__query_fail(ads,qu,adns_s_timeout);
+ return;
+ }
+
+ serv= qu->udpnextserver;
+ memset(&servaddr,0,sizeof(servaddr));
+ servaddr.sin_family= AF_INET;
+ servaddr.sin_addr= ads->servers[serv].addr;
+ servaddr.sin_port= htons(DNS_PORT);
+
+ r= sendto(ads->udpsocket,qu->querymsg,qu->querylen,0,&servaddr,sizeof(servaddr));
+ if (r<0 && errno == EMSGSIZE) { query_usetcp(ads,qu,now); return; }
+ if (r<0) adns__warn(ads,serv,"sendto failed: %s",strerror(errno));
+
+ timevaladd(&now,UDPRETRYMS);
+ qu->timeout= now;
+ qu->udpsent |= (1<<serv);
+ qu->udpnextserver= (serv+1)%ads->nservers;
+ qu->udpretries++;
+ LIST_LINK_TAIL(ads->timew,qu);
+}
+
+void adns__query_finish(adns_state ads, adns_query qu, adns_status stat) {
+ adns_answer *ans;
+ byte *newbuf;
+
+ newbuf= realloc(qu->ans.buf,qu->ans.used);
+ if (newbuf) qu->ans.buf= newbuf;
+ ans= (adns_answer*)qu->ans.buf;
+ ans->status= stat;
+ ans->cname= qu->cnameoff<0 ? 0 : qu->ans.buf + qu->cnameoff;
+ ans->rrs.str= qu->rrsoff<0 ? 0 : (char **)(qu->ans.buf + qu->rrsoff);