From 15da09fb022baafcbf345ff4548c3e054c82e2c8 Mon Sep 17 00:00:00 2001 From: Jens Georg Date: Thu, 24 Mar 2011 23:07:39 +0200 Subject: [PATCH] Fix network calculation for IPv6 --- libgssdp/gssdp-client.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/libgssdp/gssdp-client.c b/libgssdp/gssdp-client.c index 0f4198a..c38ef28 100644 --- a/libgssdp/gssdp-client.c +++ b/libgssdp/gssdp-client.c @@ -1184,9 +1184,11 @@ get_host_ip (char **iface, char **network) char ip[INET6_ADDRSTRLEN]; char net[INET6_ADDRSTRLEN]; const char *p, *q; + int i = 0; struct sockaddr_in *s4, *s4_mask; struct sockaddr_in6 *s6, *s6_mask; struct in_addr net_addr; + struct in6_addr net6_addr; p = NULL; @@ -1207,10 +1209,14 @@ get_host_ip (char **iface, char **network) p = inet_ntop (AF_INET6, &s6->sin6_addr, ip, sizeof (ip)); s6_mask = (struct sockaddr_in6 *) ifa->ifa_netmask; - net_addr.s_addr = - (in_addr_t) s6->sin6_addr.s6_addr & - (in_addr_t) s6_mask->sin6_addr.s6_addr; - q = inet_ntop (AF_INET6, &net_addr, net, sizeof (net)); + /* FIXME: Is this the right way to calculate this? */ + /* FIXME: Does this work on big endian machines? */ + for (i = 0; i < 16; ++i) { + net6_addr.s6_addr[i] = + s6->sin6_addr.s6_addr[i] & + s6_mask->sin6_addr.s6_addr[i]; + } + q = inet_ntop (AF_INET6, &net6_addr, net, sizeof (net)); break; default: continue; /* Unknown: ignore */ -- 2.7.4