summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--wocky/wocky-meta-porter.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/wocky/wocky-meta-porter.c b/wocky/wocky-meta-porter.c
index e3309d8..e37d480 100644
--- a/wocky/wocky-meta-porter.c
+++ b/wocky/wocky-meta-porter.c
@@ -416,43 +416,48 @@ wocky_meta_porter_init (WockyMetaPorter *self)
/* FIXME: these two functions are a hack until we get the
* normalization of v6-in-v4 addresses in GLib. See bgo#646082 */
-static void
-normalize_sockaddr (struct sockaddr_storage *addr)
+union BigSockAddr
{
- struct sockaddr_in *s4 = (struct sockaddr_in *) addr;
- struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) addr;
+ struct sockaddr_in s4;
+ struct sockaddr_in6 s6;
+ struct sockaddr_storage storage;
+};
- if (s6->sin6_family == AF_INET6 && IN6_IS_ADDR_V4MAPPED (&(s6->sin6_addr)))
+static void
+normalize_sockaddr (union BigSockAddr *addr)
+{
+ if (addr->s6.sin6_family == AF_INET6 && IN6_IS_ADDR_V4MAPPED (&(addr->s6.sin6_addr)))
{
/* Normalize to ipv4 address */
u_int32_t addr_big_endian;
u_int16_t port;
- memcpy (&addr_big_endian, s6->sin6_addr.s6_addr + 12, 4);
- port = s6->sin6_port;
+ memcpy (&addr_big_endian, addr->s6.sin6_addr.s6_addr + 12, 4);
+ port = addr->s6.sin6_port;
- s4->sin_family = AF_INET;
- s4->sin_addr.s_addr = addr_big_endian;
- s4->sin_port = port;
+ addr->s4.sin_family = AF_INET;
+ addr->s4.sin_addr.s_addr = addr_big_endian;
+ addr->s4.sin_port = port;
}
}
static GSocketAddress *
normalize_address (GSocketAddress *addr)
{
- struct sockaddr_storage ss;
+ union BigSockAddr ss;
if (g_socket_address_get_family (addr) != G_SOCKET_FAMILY_IPV6)
return addr;
- if (!g_socket_address_to_native (addr, &ss, sizeof (ss), NULL))
+ if (!g_socket_address_to_native (addr, &(ss.storage),
+ sizeof (ss.storage), NULL))
return addr;
g_object_unref (addr);
normalize_sockaddr (&ss);
- return g_socket_address_new_from_native (&ss, sizeof (ss));
+ return g_socket_address_new_from_native (&(ss.storage), sizeof (ss.storage));
}
static void