summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
fd5ac92)
We need a version of adns_cancel which does not call adns_returning,
for internal call sites who want to avoid reentrancy hazards.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
* in a datagram and discover that we need to retry the query.
*/
* in a datagram and discover that we need to retry the query.
*/
+void adns__cancel(adns_query qu);
void adns__query_done(adns_query qu);
void adns__query_fail(adns_query qu, adns_status stat);
void adns__cancel_children(adns_query qu);
void adns__query_done(adns_query qu);
void adns__query_fail(adns_query qu, adns_status stat);
void adns__cancel_children(adns_query qu);
for (cqu= qu->children.head; cqu; cqu= ncqu) {
ncqu= cqu->siblings.next;
for (cqu= qu->children.head; cqu; cqu= ncqu) {
ncqu= cqu->siblings.next;
adns__consistency(ads,qu_for_caller,cc_entex);
}
adns__consistency(ads,qu_for_caller,cc_entex);
}
-void adns_cancel(adns_query qu) {
+void adns__cancel(adns_query qu) {
adns_state ads;
ads= qu->ads;
adns_state ads;
ads= qu->ads;
- adns__consistency(ads,qu,cc_entex);
+ adns__consistency(ads,qu,cc_freq);
if (qu->parent) LIST_UNLINK_PART(qu->parent->children,qu,siblings.);
switch (qu->state) {
case query_tosend:
if (qu->parent) LIST_UNLINK_PART(qu->parent->children,qu,siblings.);
switch (qu->state) {
case query_tosend:
free_query_allocs(qu);
free(qu->answer);
free(qu);
free_query_allocs(qu);
free(qu->answer);
free(qu);
+}
+
+void adns_cancel(adns_query qu) {
+ adns_state ads;
+
+ assert(!qu->parent);
+ ads= qu->ads;
+ adns__consistency(ads,qu,cc_entex);
+ adns__cancel(qu);
adns__returning(ads,0);
}
adns__returning(ads,0);
}
int i;
adns__consistency(ads,0,cc_entex);
for (;;) {
int i;
adns__consistency(ads,0,cc_entex);
for (;;) {
- if (ads->udpw.head) adns_cancel(ads->udpw.head);
- else if (ads->tcpw.head) adns_cancel(ads->tcpw.head);
- else if (ads->childw.head) adns_cancel(ads->childw.head);
- else if (ads->output.head) adns_cancel(ads->output.head);
+ if (ads->udpw.head) adns__cancel(ads->udpw.head);
+ else if (ads->tcpw.head) adns__cancel(ads->tcpw.head);
+ else if (ads->childw.head) adns__cancel(ads->childw.head);
+ else if (ads->output.head) adns__cancel(ads->output.head);
else break;
}
for (i=0; i<ads->nudp; i++) close(ads->udpsocket[i].fd);
else break;
}
for (i=0; i<ads->nudp; i++) close(ads->udpsocket[i].fd);