* adns_s_systemfail is in table of errors (for eg adns_strerror).
* Improvements to install instructions, TODO, etc.
* Changed memory semantics of internal queries to fix bugs.
+ * Restarting a TCP-using query doesn't abort.
--
for (qu= ads->timew.head; qu; qu= nqu) {
nqu= qu->next;
- if (qu->state == query_udp) continue;
+ if (qu->state == query_tosend) continue;
assert(qu->state == query_tcpwait || qu->state == query_tcpsent);
qu->state= query_tcpwait;
qu->tcpfailed |= (1<<serv);
ads->tcpstate= server_ok;
for (qu= ads->timew.head; qu; qu= nqu) {
nqu= qu->next;
- if (qu->state == query_udp) continue;
+ if (qu->state == query_tosend) continue;
assert (qu->state == query_tcpwait);
adns__query_tcp(qu,now);
}
} else {
if (!act) continue;
LIST_UNLINK(ads->timew,qu);
- if (qu->state != query_udp) {
+ if (qu->state != query_tosend) {
adns__query_fail(qu,adns_s_timeout);
} else {
- adns__query_udp(qu,now);
+ adns__query_send(qu,now);
}
nqu= ads->timew.head;
}
struct adns__query {
adns_state ads;
- enum { query_udp, query_tcpwait, query_tcpsent, query_child, query_done } state;
+ enum { query_tosend, query_tcpwait, query_tcpsent, query_child, query_done } state;
adns_query back, next, parent;
struct { adns_query head, tail; } children;
struct { adns_query back, next; } siblings;
*
* state Queue child id nextudpserver sentudp failedtcp
*
- * udp NONE null >=0 0 zero zero
- * udp timew null >=0 any nonzero zero
- * udp NONE null >=0 any nonzero zero
+ * tosend NONE null >=0 0 zero zero
+ * tosend timew null >=0 any nonzero zero
+ * tosend NONE null >=0 any nonzero zero
*
* tcpwait timew null >=0 irrelevant zero any
* tcpsent timew null >=0 irrelevant zero any
* reestablishment and retry.
*/
-void adns__query_udp(adns_query qu, struct timeval now);
-/* Query must be in state udp/NONE; it will be moved to a new state,
+void adns__query_send(adns_query qu, struct timeval now);
+/* Query must be in state tosend/NONE; it will be moved to a new state,
* and no further processing can be done on it for now.
* (Resulting state is one of udp/timew, tcpwait/timew (if server not connected),
* tcpsent/timew, child/childw or done/output.)
+ * __query_send may decide to use either UDP or TCP depending whether
+ * _qf_usevc is set (or has become set) and whether the query is too
+ * large.
*/
/* From query.c: */
qu->answer= malloc(sizeof(*qu->answer)); if (!qu->answer) { free(qu); return 0; }
qu->ads= ads;
- qu->state= query_udp;
+ qu->state= query_tosend;
qu->back= qu->next= qu->parent= 0;
LIST_INIT(qu->children);
LINK_INIT(qu->siblings);
qu->query_dglen= qu->vb.used;
memcpy(qu->query_dgram,qu->vb.buf,qu->vb.used);
- adns__query_udp(qu,now);
+ adns__query_send(qu,now);
adns__autosys(ads,now);
}
void adns_cancel(adns_query qu) {
switch (qu->state) {
- case query_udp: case query_tcpwait: case query_tcpsent:
+ case query_tosend: case query_tcpwait: case query_tcpsent:
LIST_UNLINK(qu->ads->timew,qu);
break;
case query_child:
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);
}
+ if (qu->state == query_tcpsent) qu->state= query_tosend;
adns__reset_preserved(qu);
- adns__query_udp(qu,now);
+ adns__query_send(qu,now);
}
adns__tcp_tryconnect(qu->ads,now);
}
-void adns__query_udp(adns_query qu, struct timeval now) {
+void adns__query_send(adns_query qu, struct timeval now) {
struct sockaddr_in servaddr;
int serv, r;
adns_state ads;
- assert(qu->state == query_udp);
+ assert(qu->state == query_tosend);
if ((qu->flags & adns_qf_usevc) || (qu->query_dglen > DNS_MAXUDP)) {
query_usetcp(qu,now);
return;