+}
+
+void adns__quproc_tosend(adns_state ads, adns_query qu, struct timeval now) {
+ /* Query must be on the `tosend' queue, and we guarantee to remove it.
+ */
+ struct sockaddr_in servaddr;
+ int serv;
+
+ if (qu->nextudpserver == -1) { quproc_tosend_tcp(ads,qu,now); return; }
+ if (qu->querylen > UDPMAXDGRAM) {
+ qu->nextudpserver= -1;
+ quproc_tosend_tcp(ads,qu,now);
+ return;
+ }
+
+ if (qu->udpretries >= UDPMAXRETRIES) {
+ DLIST_UNLINK(ads->tosend,qu);
+ query_fail(ads,qu,adns_s_notresponding);
+ return;
+ }
+
+ serv= qu->nextudpserver;
+ memset(&servaddr,0,sizeof(servaddr));
+ servaddr.sin_family= AF_INET;
+ servaddr.sin_addr= ads->servers[serv].addr;
+ servaddr.sin_port= htons(NSPORT);
+
+ r= sendto(ads->udpsocket,qu->querymsg,qu->querylen,0,&servaddr,sizeof(servaddr));
+ if (r<0 && errno == EMSGSIZE) {
+ qu->nextudpserver= -1;
+ quproc_tosend_tcp(ads,qu,now); return;
+ }
+ if (r<0) warn("sendto %s failed: %s",inet_ntoa(servaddr.sin_addr),strerror(errno));
+