X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=gnio%2Fgsocketaddress.c;h=2421108a4a223a1900498a062f96a983c0e043e0;hb=66accc0b5f1981f188397a4a56f70d02e1532328;hp=88b470020fd774381696e3867d1af09ee68973dd;hpb=5e4f10ab70978804fed4afcb1a45ac5b6b2206cd;p=cascardo%2Fgnio.git diff --git a/gnio/gsocketaddress.c b/gnio/gsocketaddress.c index 88b4700..2421108 100644 --- a/gnio/gsocketaddress.c +++ b/gnio/gsocketaddress.c @@ -24,14 +24,20 @@ #include #include +#include +#include + #include "gsocketaddress.h" +#include "ginetsocketaddress.h" +#include "ginet4address.h" +#include "ginet6address.h" -G_DEFINE_ABSTRACT_TYPE (GSocketAddress, g_socket_address, G_TYPE_OBJECT); +G_DEFINE_ABSTRACT_TYPE (GSocketAddress, g_socket_address, G_TYPE_INITIALLY_UNOWNED); static void g_socket_address_class_init (GSocketAddressClass *klass) { - GObjectClass *gobject_class G_GNUC_UNUSED = G_OBJECT_CLASS (klass); + } static void @@ -39,3 +45,51 @@ g_socket_address_init (GSocketAddress *address) { } + +gssize +g_socket_address_native_size (GSocketAddress *address) +{ + g_return_val_if_fail (G_IS_SOCKET_ADDRESS (address), -1); + + return G_SOCKET_ADDRESS_GET_CLASS (address)->native_size (address); +} + +gboolean +g_socket_address_to_native (GSocketAddress *address, gpointer dest) +{ + g_return_val_if_fail (G_IS_SOCKET_ADDRESS (address), FALSE); + + return G_SOCKET_ADDRESS_GET_CLASS (address)->to_native (address, dest); +} + +GSocketAddress * +g_socket_address_from_native (gpointer native, gsize len) +{ + gshort family; + + if (len < sizeof (gshort)) + return NULL; + + family = ((struct sockaddr *) native)->sa_family; + + if (family == AF_UNSPEC) + return NULL; + + if (family == AF_INET) + { + struct sockaddr_in *addr = (struct sockaddr_in *) native; + + 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))); + } + + 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; +}