From 66accc0b5f1981f188397a4a56f70d02e1532328 Mon Sep 17 00:00:00 2001 From: Samuel Cormier-Iijima Date: Sat, 1 Mar 2008 23:23:55 -0500 Subject: [PATCH] IPv6 support for to_native and from_native, and support ANY address in IPv6. Patch from Thadeu Lima de Souza Cascardo --- gnio/ginet6address.c | 4 +++- gnio/ginetsocketaddress.c | 7 ++++++- gnio/gsocketaddress.c | 11 ++++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/gnio/ginet6address.c b/gnio/ginet6address.c index 6598572..1efcba5 100644 --- a/gnio/ginet6address.c +++ b/gnio/ginet6address.c @@ -138,5 +138,7 @@ g_inet6_address_new_loopback (void) GInet6Address * g_inet6_address_new_any (void) { - return NULL; + guint8 bytes[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + + return g_inet6_address_from_bytes (bytes); } diff --git a/gnio/ginetsocketaddress.c b/gnio/ginetsocketaddress.c index 040064a..0bb6196 100644 --- a/gnio/ginetsocketaddress.c +++ b/gnio/ginetsocketaddress.c @@ -151,7 +151,12 @@ g_inet_socket_address_to_native (GSocketAddress *address, } else if (G_IS_INET6_ADDRESS (addr->priv->address)) { - return FALSE; + struct sockaddr_in6 *sock = (struct sockaddr_in6 *) dest; + memset (sock, 0, sizeof (sock)); + sock->sin6_family = AF_INET6; + sock->sin6_port = g_htons (addr->priv->port); + memcpy (&(sock->sin6_addr.s6_addr), g_inet6_address_to_bytes (G_INET6_ADDRESS (addr->priv->address)), sizeof (sock->sin6_addr)); + return TRUE; } else return FALSE; diff --git a/gnio/gsocketaddress.c b/gnio/gsocketaddress.c index cd77127..2421108 100644 --- a/gnio/gsocketaddress.c +++ b/gnio/gsocketaddress.c @@ -30,6 +30,7 @@ #include "gsocketaddress.h" #include "ginetsocketaddress.h" #include "ginet4address.h" +#include "ginet6address.h" G_DEFINE_ABSTRACT_TYPE (GSocketAddress, g_socket_address, G_TYPE_INITIALLY_UNOWNED); @@ -80,7 +81,15 @@ g_socket_address_from_native (gpointer native, gsize len) return G_SOCKET_ADDRESS (g_inet_socket_address_new (G_INET_ADDRESS (g_inet4_address_from_bytes ((guint8 *) &(addr->sin_addr))), g_ntohs (addr->sin_port))); } - // TODO: handle AF_INET6 and AF_UNIX + + if (family == AF_INET6) + { + struct sockaddr_in6 *addr = (struct sockaddr_in6 *) native; + + return G_SOCKET_ADDRESS (g_inet_socket_address_new (G_INET_ADDRESS (g_inet6_address_from_bytes ((guint8 *) &(addr->sin6_addr))), g_ntohs (addr->sin6_port))); + } + + // TODO: handle AF_UNIX return NULL; } -- 2.20.1