Home | History | Annotate | Download | only in c-ares
      1 
      2 /* Copyright (C) 2005 - 2010, Daniel Stenberg
      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 
     17 #ifdef HAVE_SYS_TIME_H
     18 #include <sys/time.h>
     19 #endif
     20 
     21 #include "ares.h"
     22 #include "ares_private.h"
     23 
     24 int ares_getsock(ares_channel channel,
     25                  ares_socket_t *socks,
     26                  int numsocks) /* size of the 'socks' array */
     27 {
     28   struct server_state *server;
     29   int i;
     30   int sockindex=0;
     31   int bitmap = 0;
     32   unsigned int setbits = 0xffffffff;
     33 
     34   /* Are there any active queries? */
     35   int active_queries = !ares__is_list_empty(&(channel->all_queries));
     36 
     37   for (i = 0;
     38        (i < channel->nservers) && (sockindex < ARES_GETSOCK_MAXNUM);
     39        i++)
     40     {
     41       server = &channel->servers[i];
     42       /* We only need to register interest in UDP sockets if we have
     43        * outstanding queries.
     44        */
     45       if (active_queries && server->udp_socket != ARES_SOCKET_BAD)
     46         {
     47           if(sockindex >= numsocks)
     48             break;
     49           socks[sockindex] = server->udp_socket;
     50           bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex);
     51           sockindex++;
     52         }
     53       /* We always register for TCP events, because we want to know
     54        * when the other side closes the connection, so we don't waste
     55        * time trying to use a broken connection.
     56        */
     57       if (server->tcp_socket != ARES_SOCKET_BAD)
     58        {
     59          if(sockindex >= numsocks)
     60            break;
     61          socks[sockindex] = server->tcp_socket;
     62          bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex);
     63 
     64          if (server->qhead && active_queries)
     65            /* then the tcp socket is also writable! */
     66            bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex);
     67 
     68          sockindex++;
     69        }
     70     }
     71   return bitmap;
     72 }
     73