static void handle_error(ares_channel channel, int whichserver, time_t now) { struct query *query; /* Reset communications with this server. */ //fprintf(stderr,"kennard:ares:handle_error: ...\n"); ares__close_poll(channel, whichserver); ares__close_sockets(&channel->servers[whichserver]); /* Tell all queries talking to this server to move on and not try * this server again. */ for (query = channel->queries; query != 0; query = query->next) { assert( query != 0 ); assert( channel->queries != 0 ); if (query->server == whichserver) { query->skip_server[whichserver] = 1; #if 0 // !cj! - this seem to corrput memory when it is called next_server(channel, query, now); #endif } } }
static void end_query(ares_channel channel, struct query *query, int status, unsigned char *abuf, int alen) { struct query **q; int i; query->callback(query->arg, status, abuf, alen); for (q = &channel->queries; *q; q = &(*q)->next) { if (*q == query) break; } *q = query->next; free(query->tcpbuf); free(query->skip_server); free(query); /* Simple cleanup policy: if no queries are remaining, close all * network sockets unless STAYOPEN is set. */ if (!channel->queries && !(channel->flags & ARES_FLAG_STAYOPEN)) { for (i = 0; i < channel->nservers; i++) { //printf("end_query: closing...\n"); ares__close_poll(channel, i); ares__close_sockets(&channel->servers[i]); } } }
/* * ares_cancel() cancels all ongoing requests/resolves that might be going on * on the given channel. It does NOT kill the channel, use ares_destroy() for * that. */ void ares_cancel(ares_channel channel) { struct query *query; struct list_node* list_head; struct list_node* list_node; int i; list_head = &(channel->all_queries); for (list_node = list_head->next; list_node != list_head; ) { query = list_node->data; list_node = list_node->next; /* since we're deleting the query */ query->callback(query->arg, ARES_ETIMEOUT, 0, NULL, 0); ares__free_query(query); } #ifndef NDEBUG /* Freeing the query should remove it from all the lists in which it sits, * so all query lists should be empty now. */ assert(ares__is_list_empty(&(channel->all_queries))); for (i = 0; i < ARES_QID_TABLE_SIZE; i++) { assert(ares__is_list_empty(&(channel->queries_by_qid[i]))); } for (i = 0; i < ARES_TIMEOUT_TABLE_SIZE; i++) { assert(ares__is_list_empty(&(channel->queries_by_timeout[i]))); } #endif if (!(channel->flags & ARES_FLAG_STAYOPEN)) { if (channel->servers) { for (i = 0; i < channel->nservers; i++) ares__close_sockets(channel, &channel->servers[i]); } } }