Fixing address resolution via getaddrinfo in libfreeswan.

This commit is contained in:
Tobias Brunner 2009-08-18 12:30:11 +02:00
parent 8a17c1f907
commit 333b461aa6
2 changed files with 31 additions and 3 deletions

View File

@ -108,7 +108,8 @@ struct in_addr *addrp;
}
else
{
memcpy(&addrp->s_addr, res->ai_addr->sa_data, sizeof(addrp->s_addr));
struct sockaddr_in *in = (struct sockaddr_in*)res->ai_addr;
memcpy(&addrp->s_addr, &in->sin_addr.s_addr, sizeof(addrp->s_addr));
freeaddrinfo(res);
}

View File

@ -202,8 +202,35 @@ ip_address *dst;
}
else
{
addr = res->ai_addr->sa_data;
err = initaddr(addr, res->ai_addrlen, af, dst);
struct addrinfo *r = res;
while (r)
{
size_t addr_len;
switch (r->ai_family)
{
case AF_INET:
{
struct sockaddr_in *in = (struct sockaddr_in*)r->ai_addr;
addr_len = 4;
addr = (unsigned char*)&in->sin_addr.s_addr;
break;
}
case AF_INET6:
{
struct sockaddr_in6 *in6 = (struct sockaddr_in6*)r->ai_addr;
addr_len = 16;
addr = (unsigned char*)&in6->sin6_addr.s6_addr;
break;
}
default:
{ /* unknown family, try next result */
r = r->ai_next;
continue;
}
}
err = initaddr(addr, addr_len, r->ai_family, dst);
break;
}
freeaddrinfo(res);
}