Home | History | Annotate | Download | only in c-ares
      1 
      2 /* Copyright (C) 2004 by Daniel Stenberg et al
      3  *
      4  * Permission to use, copy, modify, and distribute this software and its
      5  * documentation for any purpose and without fee is hereby granted, provided
      6  * that the above copyright notice appear in all copies and that both that
      7  * copyright notice and this permission notice appear in supporting
      8  * documentation, and that the name of M.I.T. not be used in advertising or
      9  * publicity pertaining to distribution of the software without specific,
     10  * written prior permission.  M.I.T. makes no representations about the
     11  * suitability of this software for any purpose.  It is provided "as is"
     12  * without express or implied warranty.
     13  */
     14 
     15 #include "ares_setup.h"
     16 #include <assert.h>
     17 #include <stdlib.h>
     18 #include "ares.h"
     19 #include "ares_private.h"
     20 
     21 /*
     22  * ares_cancel() cancels all ongoing requests/resolves that might be going on
     23  * on the given channel. It does NOT kill the channel, use ares_destroy() for
     24  * that.
     25  */
     26 void ares_cancel(ares_channel channel)
     27 {
     28   struct query *query;
     29   struct list_node* list_head;
     30   struct list_node* list_node;
     31   int i;
     32 
     33   list_head = &(channel->all_queries);
     34   for (list_node = list_head->next; list_node != list_head; )
     35   {
     36     query = list_node->data;
     37     list_node = list_node->next;  /* since we're deleting the query */
     38     query->callback(query->arg, ARES_ECANCELLED, 0, NULL, 0);
     39     ares__free_query(query);
     40   }
     41 #ifndef NDEBUG
     42   /* Freeing the query should remove it from all the lists in which it sits,
     43    * so all query lists should be empty now.
     44    */
     45   assert(ares__is_list_empty(&(channel->all_queries)));
     46   for (i = 0; i < ARES_QID_TABLE_SIZE; i++)
     47     {
     48       assert(ares__is_list_empty(&(channel->queries_by_qid[i])));
     49     }
     50   for (i = 0; i < ARES_TIMEOUT_TABLE_SIZE; i++)
     51     {
     52       assert(ares__is_list_empty(&(channel->queries_by_timeout[i])));
     53     }
     54 #endif
     55   if (!(channel->flags & ARES_FLAG_STAYOPEN))
     56   {
     57     if (channel->servers)
     58     {
     59       for (i = 0; i < channel->nservers; i++)
     60         ares__close_sockets(channel, &channel->servers[i]);
     61     }
     62   }
     63 }
     64