X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fgnio.git;a=blobdiff_plain;f=gnio%2Fginet4address.c;h=a7473f8f932e5244614ded3a23fb487ea75b7fac;hp=8cb70fa6df70c5abc351d02a956439a6efdeda7f;hb=6d9680c2d5a0a77469a0e25934a3e7d726e78204;hpb=642e4b666681b0605ba8bb31c61c087c20b07630 diff --git a/gnio/ginet4address.c b/gnio/ginet4address.c index 8cb70fa..a7473f8 100644 --- a/gnio/ginet4address.c +++ b/gnio/ginet4address.c @@ -23,27 +23,109 @@ #include #include -#include "ginet4address.h" +#include +#include +#include "ginet4address.h" G_DEFINE_TYPE (GInet4Address, g_inet4_address, G_TYPE_INET_ADDRESS); struct _GInet4AddressPrivate { - - union { - guint32 u4_addr8[4]; - guint8 u4_addr32; - } addr; + union { + guint8 u4_addr8[4]; + guint32 u4_addr32; + } addr; }; +static gboolean +g_inet4_address_is_any (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET4_ADDRESS (address), FALSE); + + return (g_ntohl (G_INET4_ADDRESS (address)->priv->addr.u4_addr32) == INADDR_ANY); +} + +static gboolean +g_inet4_address_is_linklocal (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET4_ADDRESS (address), FALSE); + + return ((g_ntohl (G_INET4_ADDRESS (address)->priv->addr.u4_addr32) & 0xffff0000) == 0xa9fe0000); +} + +static gboolean +g_inet4_address_is_loopback (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET4_ADDRESS (address), FALSE); + + return (G_INET4_ADDRESS (address)->priv->addr.u4_addr8[0] == IN_LOOPBACKNET); +} + +static gboolean +g_inet4_address_is_sitelocal (GInetAddress *address) +{ + guint32 addr; + + g_return_val_if_fail (G_IS_INET4_ADDRESS (address), FALSE); + + addr = g_ntohl (G_INET4_ADDRESS (address)->priv->addr.u4_addr32); + + return ((addr & 0xff000000) == (10 << 24)) || ((addr & 0xfff00000) == 0xac100000) || ((addr & 0xffff0000) == 0xc0a80000); +} + +static gboolean +g_inet4_address_is_multicast (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET4_ADDRESS (address), FALSE); + + return IN_MULTICAST (g_ntohl (G_INET4_ADDRESS (address)->priv->addr.u4_addr32)); +} + +static gboolean +g_inet4_address_is_mc_global (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET4_ADDRESS (address), FALSE); + + return FALSE; +} + +static gboolean +g_inet4_address_is_mc_linklocal (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET4_ADDRESS (address), FALSE); + + return FALSE; +} + +static gboolean +g_inet4_address_is_mc_nodelocal (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET4_ADDRESS (address), FALSE); + + return FALSE; +} + +static gboolean +g_inet4_address_is_mc_orglocal (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET4_ADDRESS (address), FALSE); + + return FALSE; +} + +static gboolean +g_inet4_address_is_mc_sitelocal (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET4_ADDRESS (address), FALSE); + + return FALSE; +} static void g_inet4_address_finalize (GObject *object) { - GInet4Address *address; + GInet4Address *address G_GNUC_UNUSED = G_INET4_ADDRESS (object); - address = G_INET4_ADDRESS (object); - if (G_OBJECT_CLASS (g_inet4_address_parent_class)->finalize) (*G_OBJECT_CLASS (g_inet4_address_parent_class)->finalize) (object); } @@ -51,25 +133,33 @@ g_inet4_address_finalize (GObject *object) static void g_inet4_address_dispose (GObject *object) { - GInet4Address *address; + GInet4Address *address G_GNUC_UNUSED = G_INET4_ADDRESS (object);; - address = G_INET4_ADDRESS (object); - if (G_OBJECT_CLASS (g_inet4_address_parent_class)->dispose) (*G_OBJECT_CLASS (g_inet4_address_parent_class)->dispose) (object); } - static void g_inet4_address_class_init (GInet4AddressClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GInetAddressClass *ginetaddress_class = G_INET_ADDRESS_CLASS (klass); g_type_class_add_private (klass, sizeof (GInet4AddressPrivate)); - + gobject_class->finalize = g_inet4_address_finalize; gobject_class->dispose = g_inet4_address_dispose; + ginetaddress_class->is_any = g_inet4_address_is_any; + ginetaddress_class->is_linklocal = g_inet4_address_is_linklocal; + ginetaddress_class->is_loopback = g_inet4_address_is_loopback; + ginetaddress_class->is_sitelocal = g_inet4_address_is_sitelocal; + ginetaddress_class->is_multicast = g_inet4_address_is_multicast; + ginetaddress_class->is_mc_global = g_inet4_address_is_mc_global; + ginetaddress_class->is_mc_linklocal = g_inet4_address_is_mc_linklocal; + ginetaddress_class->is_mc_nodelocal = g_inet4_address_is_mc_nodelocal; + ginetaddress_class->is_mc_orglocal = g_inet4_address_is_mc_orglocal; + ginetaddress_class->is_mc_sitelocal = g_inet4_address_is_mc_sitelocal; } static void @@ -84,38 +174,66 @@ g_inet4_address_init (GInet4Address *address) /* Public Functions */ GInet4Address * -g_inet4_address_from_string (const char *string) +g_inet4_address_from_string (const gchar *string) { - return NULL; + struct in_addr addr; + + if (!inet_aton (string, &addr)) + { + g_warning ("Could not parse IP address %s", string); + return NULL; + } + + return g_inet4_address_from_bytes ((guint8 *) &(addr.s_addr)); } char * g_inet4_address_to_string (GInet4Address *address) { - return NULL; + guint8 *addr; + + g_return_val_if_fail (G_IS_INET4_ADDRESS (address), NULL); + + addr = address->priv->addr.u4_addr8; + + return g_strdup_printf ("%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]); } GInet4Address * g_inet4_address_from_bytes (guint8 bytes[]) { - return NULL; + GInet4Address *address = G_INET4_ADDRESS (g_object_new (G_TYPE_INET4_ADDRESS, NULL)); + + guint8 *addr = address->priv->addr.u4_addr8; + + addr[0] = bytes[0]; + addr[1] = bytes[1]; + addr[2] = bytes[2]; + addr[3] = bytes[3]; + + return address; } const guint8 * g_inet4_address_to_bytes (GInet4Address *address) { - return NULL; + g_return_val_if_fail (G_IS_INET4_ADDRESS (address), NULL); + + return address->priv->addr.u4_addr8; } -GInetAddress * -g_inet4address_new_loopback (void) +GInet4Address * +g_inet4_address_new_loopback (void) { - return NULL; + guint8 addr[8] = {127, 0, 0, 1}; + + return g_inet4_address_from_bytes (addr); } -GInetAddress * -g_inet4address_new_any (void) +GInet4Address * +g_inet4_address_new_any (void) { - return NULL; -} + guint8 addr[8] = {0, 0, 0, 0}; + return g_inet4_address_from_bytes (addr); +}