summaryrefslogtreecommitdiff
path: root/ares_getsock.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2005-12-22 15:27:41 +0000
committerDaniel Stenberg <daniel@haxx.se>2005-12-22 15:27:41 +0000
commit8d63eb75a948235973717310f7fd605dd908bb3c (patch)
tree8e40df4f39328ca0311901f422923f2d887bcc13 /ares_getsock.c
parentcb2a75dece92c36e58b894da01d0012c729b130d (diff)
downloadc-ares-8d63eb75a948235973717310f7fd605dd908bb3c.tar.gz
c-ares-8d63eb75a948235973717310f7fd605dd908bb3c.tar.bz2
c-ares-8d63eb75a948235973717310f7fd605dd908bb3c.zip
Added ares_getsock() to extract sockets to wait for action on, without being
limited to select().
Diffstat (limited to 'ares_getsock.c')
-rw-r--r--ares_getsock.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/ares_getsock.c b/ares_getsock.c
new file mode 100644
index 0000000..3c52a83
--- /dev/null
+++ b/ares_getsock.c
@@ -0,0 +1,71 @@
+/* $Id$ */
+
+/* Copyright 2005 by Daniel Stenberg.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of M.I.T. not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ */
+
+#include "setup.h"
+#include <sys/types.h>
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+#include "ares.h"
+#include "ares_private.h"
+
+int ares_getsock(ares_channel channel,
+ int *s,
+ int numsocks) /* size of the 'socks' array */
+{
+ struct server_state *server;
+ ares_socket_t nfds;
+ int i;
+ int sockindex=0;
+ int bitmap = 0;
+ unsigned int setbits = 0xffffffff;
+
+ ares_socket_t *socks = (ares_socket_t *)s;
+
+ /* No queries, no file descriptors. */
+ if (!channel->queries)
+ return 0;
+
+ nfds = 0;
+ for (i = 0; i < channel->nservers; i++)
+ {
+ server = &channel->servers[i];
+ if (server->udp_socket != ARES_SOCKET_BAD)
+ {
+ if(sockindex >= numsocks)
+ break;
+ socks[sockindex] = server->udp_socket;
+ bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex);
+ sockindex++;
+ }
+ if (server->tcp_socket != ARES_SOCKET_BAD)
+ {
+ if(sockindex >= numsocks)
+ break;
+ socks[sockindex] = server->tcp_socket;
+ bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex);
+ sockindex++;
+
+ if (server->qhead) {
+ /* then the tcp socket is also writable! */
+ bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex-1);
+ }
+
+ }
+ }
+ return (int)nfds;
+}