Skip to content

Commit

Permalink
Return IPv4 addresses before IPv6 addresses from getaddrinfo
Browse files Browse the repository at this point in the history
  • Loading branch information
ry committed Oct 26, 2011
1 parent 3524f41 commit 194511f
Showing 1 changed file with 27 additions and 6 deletions.
33 changes: 27 additions & 6 deletions src/cares_wrap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down

0 comments on commit 194511f

Please sign in to comment.