Charles Hardin patch:
authorYang Tse <yangsita@gmail.com>
Tue, 21 Oct 2008 01:58:23 +0000 (01:58 +0000)
committerYang Tse <yangsita@gmail.com>
Tue, 21 Oct 2008 01:58:23 +0000 (01:58 +0000)
- handles the EINPROGRESS for UDP connects
- uses closesocket instead of close on some paths that were noticed

ares/CHANGES
ares/ares_process.c

index c64ad799ed26b6324475618a302a2f24930c032d..dd9bac6c9a78d89231a0ce9174340b086075ea3a 100644 (file)
@@ -1,5 +1,8 @@
   Changelog for the c-ares project
 
+* Oct 21 2008 (Yang Tse)
+  Charles Hardin added handling of EINPROGRESS for UDP connects.
+
 * Oct 18 2008 (Daniel Stenberg)
   Charles Hardin made adig support a regular numerical dotted IP address for the
   -s option as well.
index 798df7a210b0cab3d176484e873b68f14ead554d..675af489d81a0369ee97b95450dd27a71d271bbc 100644 (file)
@@ -906,7 +906,7 @@ static int open_tcp_socket(ares_channel channel, struct server_state *server)
   /* Configure it. */
   if (configure_socket(s, channel) < 0)
     {
-       close(s);
+       closesocket(s);
        return -1;
     }
 
@@ -920,7 +920,7 @@ static int open_tcp_socket(ares_channel channel, struct server_state *server)
   if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY,
                  (void *)&opt, sizeof(opt)) == -1)
     {
-       close(s);
+       closesocket(s);
        return -1;
     }
 
@@ -929,14 +929,16 @@ static int open_tcp_socket(ares_channel channel, struct server_state *server)
   sockin.sin_family = AF_INET;
   sockin.sin_addr = server->addr;
   sockin.sin_port = (unsigned short)(channel->tcp_port & 0xffff);
-  if (connect(s, (struct sockaddr *) &sockin, sizeof(sockin)) == -1) {
-    int err = SOCKERRNO;
+  if (connect(s, (struct sockaddr *) &sockin, sizeof(sockin)) == -1)
+    {
+      int err = SOCKERRNO;
 
-    if (err != EINPROGRESS && err != EWOULDBLOCK) {
-      closesocket(s);
-      return -1;
+      if (err != EINPROGRESS && err != EWOULDBLOCK)
+        {
+          closesocket(s);
+          return -1;
+        }
     }
-  }
 
   SOCK_STATE_CALLBACK(channel, s, 1, 0);
   server->tcp_buffer_pos = 0;
@@ -958,7 +960,7 @@ static int open_udp_socket(ares_channel channel, struct server_state *server)
   /* Set the socket non-blocking. */
   if (configure_socket(s, channel) < 0)
     {
-       close(s);
+       closesocket(s);
        return -1;
     }
 
@@ -969,8 +971,13 @@ static int open_udp_socket(ares_channel channel, struct server_state *server)
   sockin.sin_port = (unsigned short)(channel->udp_port & 0xffff);
   if (connect(s, (struct sockaddr *) &sockin, sizeof(sockin)) == -1)
     {
-      closesocket(s);
-      return -1;
+      int err = SOCKERRNO;
+
+      if (err != EINPROGRESS && err != EWOULDBLOCK)
+        {
+          closesocket(s);
+          return -1;
+        }
     }
 
   SOCK_STATE_CALLBACK(channel, s, 1, 0);