#include "internal.h"
void adns__procdgram(adns_state ads, const byte *dgram, int dglen,
- int serv, struct timeval now) {
+ int serv, int viatcp, struct timeval now) {
int cbyte, rrstart, wantedrrs, rri, foundsoa, foundns, cname_here;
int id, f1, f2, qdcount, ancount, nscount, arcount;
int flg_ra, flg_rd, flg_tc, flg_qr, opcode;
dgram+DNS_HDRSIZE,
qu->query_dglen-DNS_HDRSIZE))
continue;
+ if (viatcp) {
+ if (qu->state != query_tcpsent) continue;
+ } else {
+ if (qu->state != query_tosend) continue;
+ if (!(qu->udpsent & (1<<serv))) continue;
+ }
break;
}
if (!qu) {
if (!qu->vb.used) goto x_truncated;
if (st) { adns__query_fail(qu,st); return; }
l= strlen(qu->vb.buf)+1;
- qu->answer->cname= adns__alloc_interim(qu,l);
+ qu->answer->cname= adns__alloc_preserved(qu,l);
if (!qu->answer->cname) { adns__query_fail(qu,adns_s_nomemory); return; }
qu->cname_dgram= adns__alloc_mine(qu,dglen);
if (rcode == rcode_nxdomain) {
/* We still wanted to look for the SOA so we could find the TTL. */
adns__update_expires(qu,soattl,now);
- adns__query_fail(qu,adns_s_nxdomain);
+
+ if (qu->flags & adns_qf_search) {
+ adns__search_next(ads,qu,now);
+ } else {
+ adns__query_fail(qu,adns_s_nxdomain);
+ }
return;
}
LIST_LINK_TAIL(ads->childw,qu);
return;
}
-
adns__query_done(qu);
return;
qu->flags |= adns_qf_usevc;
x_restartquery:
-
if (qu->cname_dgram) {
st= adns__mkquery_frdgram(qu->ads,&qu->vb,&qu->id,
qu->cname_dgram, qu->cname_dglen, qu->cname_begin,
memcpy(newquery,qu->vb.buf,qu->vb.used);
}
- adns__reset_cnameonly(qu);
- adns__query_udp(qu,now);
+ if (qu->state == query_tcpsent) qu->state= query_tosend;
+ adns__reset_preserved(qu);
+ adns__query_send(qu,now);
}