Return IPv4 addresses before IPv6 addresses from getaddrinfo
authorRyan Dahl <ry@tinyclouds.org>
Wed, 26 Oct 2011 19:27:31 +0000 (12:27 -0700)
committerRyan Dahl <ry@tinyclouds.org>
Wed, 26 Oct 2011 19:28:25 +0000 (12:28 -0700)
src/cares_wrap.cc

index 6c36c780c95456c080297e29de92a58afcd89eb1..409430ef58afdda22e4f3abcade797c563ac996e 100644 (file)
@@ -627,31 +627,52 @@ void AfterGetAddrInfo(uv_getaddrinfo_t* req, int status, struct addrinfo* res) {
 
     n = 0;
 
-    // Iterate over the responses again this time creating javascript
+    // Iterate over the IPv4 responses again this time creating javascript
     // strings for each IP and filling the results array.
     address = res;
     while (address) {
       assert(address->ai_socktype == SOCK_STREAM);
 
       // Ignore random ai_family types.
-      if (address->ai_family == AF_INET || address->ai_family == AF_INET6) {
+      if (address->ai_family == AF_INET) {
         // Juggle pointers
-        addr = (address->ai_family == AF_INET ?
-            (char*) &((struct sockaddr_in*) address->ai_addr)->sin_addr :
-            (char*) &((struct sockaddr_in6*) address->ai_addr)->sin6_addr);
+        addr = (char*) &((struct sockaddr_in*) address->ai_addr)->sin_addr;
         const char* c = uv_inet_ntop(address->ai_family, addr, ip,
             INET6_ADDRSTRLEN);
 
         // Create JavaScript string
         Local<String> s = String::New(c);
         results->Set(n, s);
+        n++;
+      }
+
+      // Increment
+      address = address->ai_next;
+    }
+
+    // Iterate over the IPv6 responses putting them in the array.
+    address = res;
+    while (address) {
+      assert(address->ai_socktype == SOCK_STREAM);
+
+      // Ignore random ai_family types.
+      if (address->ai_family == AF_INET6) {
+        // Juggle pointers
+        addr = (char*) &((struct sockaddr_in6*) address->ai_addr)->sin6_addr;
+        const char* c = uv_inet_ntop(address->ai_family, addr, ip,
+            INET6_ADDRSTRLEN);
+
+        // Create JavaScript string
+        Local<String> s = String::New(c);
+        results->Set(n, s);
+        n++;
       }
 
       // Increment
-      n++;
       address = address->ai_next;
     }
 
+
     argv[0] = results;
   }