summaryrefslogtreecommitdiff
path: root/src/lib/ares_fds.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/ares_fds.c')
-rw-r--r--src/lib/ares_fds.c85
1 files changed, 47 insertions, 38 deletions
diff --git a/src/lib/ares_fds.c b/src/lib/ares_fds.c
index f405fc0..c1fb794 100644
--- a/src/lib/ares_fds.c
+++ b/src/lib/ares_fds.c
@@ -1,59 +1,68 @@
-
-/* Copyright 1998 by the Massachusetts Institute of Technology.
+/* MIT License
+ *
+ * Copyright (c) 1998 Massachusetts Institute of Technology
+ * Copyright (c) The c-ares project and its contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
*
- * 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.
+ * SPDX-License-Identifier: MIT
*/
#include "ares_setup.h"
#include "ares.h"
-#include "ares_nowarn.h"
#include "ares_private.h"
int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
{
struct server_state *server;
- ares_socket_t nfds;
- int i;
+ ares_socket_t nfds;
+ size_t i;
/* Are there any active queries? */
- int active_queries = !ares__is_list_empty(&(channel->all_queries));
+ size_t active_queries = ares__llist_len(channel->all_queries);
nfds = 0;
- for (i = 0; i < channel->nservers; i++)
- {
- server = &channel->servers[i];
+ for (i = 0; i < channel->nservers; i++) {
+ ares__llist_node_t *node;
+ server = &channel->servers[i];
+
+ for (node = ares__llist_node_first(server->connections); node != NULL;
+ node = ares__llist_node_next(node)) {
+ const struct server_connection *conn = ares__llist_node_val(node);
+
/* We only need to register interest in UDP sockets if we have
* outstanding queries.
*/
- if (active_queries && server->udp_socket != ARES_SOCKET_BAD)
- {
- FD_SET(server->udp_socket, read_fds);
- if (server->udp_socket >= nfds)
- nfds = server->udp_socket + 1;
+ if (active_queries || conn->is_tcp) {
+ FD_SET(conn->fd, read_fds);
+ if (conn->fd >= nfds) {
+ nfds = conn->fd + 1;
}
- /* We always register for TCP events, because we want to know
- * when the other side closes the connection, so we don't waste
- * time trying to use a broken connection.
- */
- if (server->tcp_socket != ARES_SOCKET_BAD)
- {
- FD_SET(server->tcp_socket, read_fds);
- if (server->qhead)
- FD_SET(server->tcp_socket, write_fds);
- if (server->tcp_socket >= nfds)
- nfds = server->tcp_socket + 1;
- }
+ }
+
+ if (conn->is_tcp && ares__buf_len(server->tcp_send)) {
+ FD_SET(conn->fd, write_fds);
+ }
}
- return (int)nfds;
+ }
+
+ return nfds;
}