]> granicus.if.org Git - curl/commitdiff
Eliminate a unnecessary socket creation in Curl_getaddrinfo for an IPv4
authorDan Fandrich <dan@coneharvesters.com>
Tue, 29 Jul 2008 18:26:35 +0000 (18:26 +0000)
committerDan Fandrich <dan@coneharvesters.com>
Tue, 29 Jul 2008 18:26:35 +0000 (18:26 +0000)
address in an IPv6 capable libcurl.

lib/hostthre.c

index 1e900311ae59a8f468f33f29faf02ff9e3e712be..a35a54cf8d26056fa2fc13961531b05196256373 100644 (file)
@@ -771,40 +771,41 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
   struct addrinfo hints, *res;
   int error;
   char sbuf[NI_MAXSERV];
-  curl_socket_t s;
   int pf;
   struct SessionHandle *data = conn->data;
 
   *waitp = FALSE; /* default to synch response */
 
-  /* see if we have an IPv6 stack */
-  s = socket(PF_INET6, SOCK_DGRAM, 0);
-  if(s == CURL_SOCKET_BAD) {
-    /* Some non-IPv6 stacks have been found to make very slow name resolves
-     * when PF_UNSPEC is used, so thus we switch to a mere PF_INET lookup if
-     * the stack seems to be a non-ipv6 one. */
-
+  /*
+   * Check if a limited name resolve has been requested.
+   */
+  switch(data->set.ip_version) {
+  case CURL_IPRESOLVE_V4:
     pf = PF_INET;
-  }
-  else {
-    /* This seems to be an IPv6-capable stack, use PF_UNSPEC for the widest
-     * possible checks. And close the socket again.
-     */
-    sclose(s);
+    break;
+  case CURL_IPRESOLVE_V6:
+    pf = PF_INET6;
+    break;
+  default:
+    pf = PF_UNSPEC;
+    break;
+  }
+
+  if (pf != PF_INET) {
+    /* see if we have an IPv6 stack */
+    curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0);
+    if(s == CURL_SOCKET_BAD) {
+      /* Some non-IPv6 stacks have been found to make very slow name resolves
+       * when PF_UNSPEC is used, so thus we switch to a mere PF_INET lookup if
+       * the stack seems to be a non-ipv6 one. */
 
-    /*
-     * Check if a more limited name resolve has been requested.
-     */
-    switch(data->set.ip_version) {
-    case CURL_IPRESOLVE_V4:
       pf = PF_INET;
-      break;
-    case CURL_IPRESOLVE_V6:
-      pf = PF_INET6;
-      break;
-    default:
-      pf = PF_UNSPEC;
-      break;
+    }
+    else {
+      /* This seems to be an IPv6-capable stack, use PF_UNSPEC for the widest
+       * possible checks. And close the socket again.
+       */
+      sclose(s);
     }
   }