IPv6 support for to_native and from_native, and support
authorSamuel Cormier-Iijima <sciyoshi@gmail.com>
Sun, 2 Mar 2008 04:23:55 +0000 (23:23 -0500)
committerSamuel Cormier-Iijima <sciyoshi@gmail.com>
Sun, 2 Mar 2008 04:23:55 +0000 (23:23 -0500)
ANY address in IPv6.

Patch from Thadeu Lima de Souza Cascardo <cascardo@minaslivre.org>

gnio/ginet6address.c
gnio/ginetsocketaddress.c
gnio/gsocketaddress.c

index 6598572..1efcba5 100644 (file)
@@ -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);
 }
index 040064a..0bb6196 100644 (file)
@@ -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;
index cd77127..2421108 100644 (file)
@@ -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;
 }