diff options
author | Daniel Stenberg <daniel@haxx.se> | 2005-12-22 15:27:41 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2005-12-22 15:27:41 +0000 |
commit | e5247ae65d9884c7c454b1cb641b66e2beb047ef (patch) | |
tree | 80004250818062cc8072fc38ea25d49b8a2a7a9a /ares/ares_getsock.c | |
parent | a718cb05ff4405dd5a3e09b718413b5066fc5e09 (diff) |
Added ares_getsock() to extract sockets to wait for action on, without being
limited to select().
Diffstat (limited to 'ares/ares_getsock.c')
-rw-r--r-- | ares/ares_getsock.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/ares/ares_getsock.c b/ares/ares_getsock.c new file mode 100644 index 000000000..3c52a8367 --- /dev/null +++ b/ares/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; +} |