aboutsummaryrefslogtreecommitdiffstats
path: root/src/libfreeswan/ttoaddr.c
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2009-08-18 12:30:11 +0200
committerTobias Brunner <tobias@strongswan.org>2009-08-18 12:30:11 +0200
commit333b461aa689c29197dadb2a15abc3ccade0c89a (patch)
tree459ef51e75a4bf2cdde5aea7caed2830c457d909 /src/libfreeswan/ttoaddr.c
parent8a17c1f9079edc7901d0342a5b746b9d1dcb2704 (diff)
downloadstrongswan-333b461aa689c29197dadb2a15abc3ccade0c89a.tar.bz2
strongswan-333b461aa689c29197dadb2a15abc3ccade0c89a.tar.xz
Fixing address resolution via getaddrinfo in libfreeswan.4.3.4
Diffstat (limited to 'src/libfreeswan/ttoaddr.c')
-rw-r--r--src/libfreeswan/ttoaddr.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/src/libfreeswan/ttoaddr.c b/src/libfreeswan/ttoaddr.c
index ede0713f0..bda2be5ed 100644
--- a/src/libfreeswan/ttoaddr.c
+++ b/src/libfreeswan/ttoaddr.c
@@ -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);
}