From 15ddc1f1347ec3853cf3d9ed91c137c440fed35a Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Thu, 28 Jan 2010 22:03:48 +0000 Subject: [PATCH] - Tommie Gannert pointed out a silly bug in ares_process_fd() since it didn't check for broken connections like ares_process() did. Based on that, I merged the two functions into a single generic one with two front-ends. --- ares/CHANGES | 5 +++++ ares/RELEASE-NOTES | 3 ++- ares/ares_process.c | 49 ++++++++++++++++++++++++++------------------- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/ares/CHANGES b/ares/CHANGES index 8ad0b9d63..c3961c4c5 100644 --- a/ares/CHANGES +++ b/ares/CHANGES @@ -1,5 +1,10 @@ Changelog for the c-ares project +* January 28, 2010 (Daniel Stenberg) +- Tommie Gannert pointed out a silly bug in ares_process_fd() since it didn't + check for broken connections like ares_process() did. Based on that, I + merged the two functions into a single generic one with two front-ends. + * December 29, 2009 (Yang Tse) - Laszlo Tamas Szabo adjusted Makefile.msvc compiler options so that where run-time error checks enabling compiler option /GZ was used it is replaced diff --git a/ares/RELEASE-NOTES b/ares/RELEASE-NOTES index a444c2c18..120ac2908 100644 --- a/ares/RELEASE-NOTES +++ b/ares/RELEASE-NOTES @@ -8,9 +8,10 @@ Fixed: o closing of sockets on Windows systems o MSVC deprecated compiler options warnings + o ares_process_fd() didn't check broken connections Thanks go to these friendly people for their efforts and contributions: - Ingmar Runge, Laszlo Tamas Szabo + Ingmar Runge, Laszlo Tamas Szabo, Yang Tse, Tommie Gannert Have fun! diff --git a/ares/ares_process.c b/ares/ares_process.c index 4b5f18251..01036f5be 100644 --- a/ares/ares_process.c +++ b/ares/ares_process.c @@ -1,7 +1,7 @@ /* $Id$ */ /* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2004-2009 by Daniel Stenberg + * Copyright (C) 2004-2010 by Daniel Stenberg * * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without @@ -139,18 +139,28 @@ long ares__timeoffset(struct timeval *now, } +/* + * generic process function + */ +static void processfds(ares_channel channel, + fd_set *read_fds, ares_socket_t read_fd, + fd_set *write_fds, ares_socket_t write_fd) +{ + struct timeval now = ares__tvnow(); + + write_tcp_data(channel, write_fds, write_fd, &now); + read_tcp_data(channel, read_fds, read_fd, &now); + read_udp_packets(channel, read_fds, read_fd, &now); + process_timeouts(channel, &now); + process_broken_connections(channel, &now); +} + /* Something interesting happened on the wire, or there was a timeout. * See what's up and respond accordingly. */ void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds) { - struct timeval now = ares__tvnow(); - - write_tcp_data(channel, write_fds, ARES_SOCKET_BAD, &now); - read_tcp_data(channel, read_fds, ARES_SOCKET_BAD, &now); - read_udp_packets(channel, read_fds, ARES_SOCKET_BAD, &now); - process_timeouts(channel, &now); - process_broken_connections(channel, &now); + processfds(channel, read_fds, ARES_SOCKET_BAD, write_fds, ARES_SOCKET_BAD); } /* Something interesting happened on the wire, or there was a timeout. @@ -161,12 +171,7 @@ void ares_process_fd(ares_channel channel, file descriptors */ ares_socket_t write_fd) { - struct timeval now = ares__tvnow(); - - write_tcp_data(channel, NULL, write_fd, &now); - read_tcp_data(channel, NULL, read_fd, &now); - read_udp_packets(channel, NULL, read_fd, &now); - process_timeouts(channel, &now); + processfds(channel, NULL, read_fd, NULL, write_fd); } @@ -174,7 +179,8 @@ void ares_process_fd(ares_channel channel, * otherwise. This is mostly for HP-UX, which could return EAGAIN or * EWOULDBLOCK. See this man page * - * http://devrsrc1.external.hp.com/STKS/cgi-bin/man2html?manpage=/usr/share/man/man2.Z/send.2 + * http://devrsrc1.external.hp.com/STKS/cgi-bin/man2html? + * manpage=/usr/share/man/man2.Z/send.2 */ static int try_again(int errnum) { @@ -802,8 +808,9 @@ void ares__send_query(ares_channel channel, struct query *query, } /* - * setsocknonblock sets the given socket to either blocking or non-blocking mode - * based on the 'nonblock' boolean argument. This function is highly portable. + * setsocknonblock sets the given socket to either blocking or non-blocking + * mode based on the 'nonblock' boolean argument. This function is highly + * portable. */ static int setsocknonblock(ares_socket_t sockfd, /* operate on this */ int nonblock /* TRUE or FALSE */) @@ -902,10 +909,10 @@ static int open_tcp_socket(ares_channel channel, struct server_state *server) #ifdef TCP_NODELAY /* - * Disable the Nagle algorithm (only relevant for TCP sockets, and thus not in - * configure_socket). In general, in DNS lookups we're pretty much interested - * in firing off a single request and then waiting for a reply, so batching - * isn't very interesting in general. + * Disable the Nagle algorithm (only relevant for TCP sockets, and thus not + * in configure_socket). In general, in DNS lookups we're pretty much + * interested in firing off a single request and then waiting for a reply, + * so batching isn't very interesting in general. */ opt = 1; if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY,