Renamed c-ares setup.h to ares_setup.h
[platform/upstream/c-ares.git] / ares_getsock.c
1 /* $Id$ */
2
3 /* Copyright (C) 2005 - 2007, Daniel Stenberg
4  *
5  * Permission to use, copy, modify, and distribute this software and its
6  * documentation for any purpose and without fee is hereby granted, provided
7  * that the above copyright notice appear in all copies and that both that
8  * copyright notice and this permission notice appear in supporting
9  * documentation, and that the name of M.I.T. not be used in advertising or
10  * publicity pertaining to distribution of the software without specific,
11  * written prior permission.  M.I.T. makes no representations about the
12  * suitability of this software for any purpose.  It is provided "as is"
13  * without express or implied warranty.
14  */
15
16 #include "ares_setup.h"
17
18 #ifdef HAVE_SYS_TIME_H
19 #include <sys/time.h>
20 #endif
21
22 #include "ares.h"
23 #include "ares_private.h"
24
25 int ares_getsock(ares_channel channel,
26                  int *s,
27                  int numsocks) /* size of the 'socks' array */
28 {
29   struct server_state *server;
30   int i;
31   int sockindex=0;
32   int bitmap = 0;
33   unsigned int setbits = 0xffffffff;
34
35   ares_socket_t *socks = (ares_socket_t *)s;
36
37   /* Are there any active queries? */
38   int active_queries = !ares__is_list_empty(&(channel->all_queries));
39
40   for (i = 0;
41        (i < channel->nservers) && (sockindex < ARES_GETSOCK_MAXNUM);
42        i++)
43     {
44       server = &channel->servers[i];
45       /* We only need to register interest in UDP sockets if we have
46        * outstanding queries.
47        */
48       if (active_queries && server->udp_socket != ARES_SOCKET_BAD)
49         {
50           if(sockindex >= numsocks)
51             break;
52           socks[sockindex] = server->udp_socket;
53           bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex);
54           sockindex++;
55         }
56       /* We always register for TCP events, because we want to know
57        * when the other side closes the connection, so we don't waste
58        * time trying to use a broken connection.
59        */
60       if (server->tcp_socket != ARES_SOCKET_BAD)
61        {
62          if(sockindex >= numsocks)
63            break;
64          socks[sockindex] = server->tcp_socket;
65          bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex);
66
67          if (server->qhead && active_queries)
68            /* then the tcp socket is also writable! */
69            bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex);
70
71          sockindex++;
72        }
73     }
74   return bitmap;
75 }