[glib: 1/2] ginetaddress: Handle systems without IPv6 support




commit f4ca92df2b4510278ce4fadfe6e13353d8e1e596
Author: WorksButNotTested <62701594+WorksButNotTested users noreply github com>
Date:   Wed Jan 6 00:16:36 2021 +0100

    ginetaddress: Handle systems without IPv6 support

 gio/ginetaddress.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 meson.build        |  7 +++++
 2 files changed, 83 insertions(+), 4 deletions(-)
---
diff --git a/gio/ginetaddress.c b/gio/ginetaddress.c
index 3eedaedea..ada32f877 100644
--- a/gio/ginetaddress.c
+++ b/gio/ginetaddress.c
@@ -36,7 +36,9 @@ struct _GInetAddressPrivate
   GSocketFamily family;
   union {
     struct in_addr ipv4;
+#ifdef HAVE_IPV6
     struct in6_addr ipv6;
+#endif
   } addr;
 };
 
@@ -99,10 +101,16 @@ g_inet_address_set_property (GObject      *object,
       break;
 
     case PROP_BYTES:
+#ifdef HAVE_IPV6
       memcpy (&address->priv->addr, g_value_get_pointer (value),
              address->priv->family == AF_INET ?
              sizeof (address->priv->addr.ipv4) :
              sizeof (address->priv->addr.ipv6));
+#else
+      g_assert (address->priv->family == AF_INET);
+      memcpy (&address->priv->addr, g_value_get_pointer (value),
+              sizeof (address->priv->addr.ipv4));
+#endif
       break;
 
     default:
@@ -385,7 +393,9 @@ GInetAddress *
 g_inet_address_new_from_string (const gchar *string)
 {
   struct in_addr in_addr;
+#ifdef HAVE_IPV6
   struct in6_addr in6_addr;
+#endif
 
   g_return_val_if_fail (string != NULL, NULL);
 
@@ -397,8 +407,10 @@ g_inet_address_new_from_string (const gchar *string)
 
   if (inet_pton (AF_INET, string, &in_addr) > 0)
     return g_inet_address_new_from_bytes ((guint8 *)&in_addr, AF_INET);
+#ifdef HAVE_IPV6
   else if (inet_pton (AF_INET6, string, &in6_addr) > 0)
     return g_inet_address_new_from_bytes ((guint8 *)&in6_addr, AF_INET6);
+#endif
 
   return NULL;
 }
@@ -455,7 +467,11 @@ g_inet_address_new_loopback (GSocketFamily family)
       return g_inet_address_new_from_bytes (addr, family);
     }
   else
+#ifdef HAVE_IPV6
     return g_inet_address_new_from_bytes (in6addr_loopback.s6_addr, family);
+#else
+    g_assert_not_reached ();
+#endif
 }
 
 /**
@@ -483,7 +499,11 @@ g_inet_address_new_any (GSocketFamily family)
       return g_inet_address_new_from_bytes (addr, family);
     }
   else
+#ifdef HAVE_IPV6
     return g_inet_address_new_from_bytes (in6addr_any.s6_addr, family);
+#else
+    g_assert_not_reached ();
+#endif
 }
 
 
@@ -506,11 +526,19 @@ g_inet_address_to_string (GInetAddress *address)
   g_return_val_if_fail (G_IS_INET_ADDRESS (address), NULL);
 
   if (address->priv->family == AF_INET)
-    inet_ntop (AF_INET, &address->priv->addr.ipv4, buffer, sizeof (buffer));
+    {
+      inet_ntop (AF_INET, &address->priv->addr.ipv4, buffer, sizeof (buffer));
+      return g_strdup (buffer);
+    }
   else
-    inet_ntop (AF_INET6, &address->priv->addr.ipv6, buffer, sizeof (buffer));
-
-  return g_strdup (buffer);
+    {
+#ifdef HAVE_IPV6
+      inet_ntop (AF_INET6, &address->priv->addr.ipv6, buffer, sizeof (buffer));
+      return g_strdup (buffer);
+#else
+      g_assert_not_reached ();
+#endif
+    }
 }
 
 /**
@@ -549,7 +577,11 @@ g_inet_address_get_native_size (GInetAddress *address)
 {
   if (address->priv->family == AF_INET)
     return sizeof (address->priv->addr.ipv4);
+#ifdef HAVE_IPV6
   return sizeof (address->priv->addr.ipv6);
+#else
+  g_assert_not_reached ();
+#endif
 }
 
 /**
@@ -592,7 +624,11 @@ g_inet_address_get_is_any (GInetAddress *address)
       return addr4 == INADDR_ANY;
     }
   else
+#ifdef HAVE_IPV6
     return IN6_IS_ADDR_UNSPECIFIED (&address->priv->addr.ipv6);
+#else
+    g_assert_not_reached ();
+#endif
 }
 
 /**
@@ -618,7 +654,11 @@ g_inet_address_get_is_loopback (GInetAddress *address)
       return ((addr4 & 0xff000000) == 0x7f000000);
     }
   else
+#ifdef HAVE_IPV6
     return IN6_IS_ADDR_LOOPBACK (&address->priv->addr.ipv6);
+#else
+    g_assert_not_reached ();
+#endif
 }
 
 /**
@@ -646,7 +686,11 @@ g_inet_address_get_is_link_local (GInetAddress *address)
       return ((addr4 & 0xffff0000) == 0xa9fe0000);
     }
   else
+#ifdef HAVE_IPV6
     return IN6_IS_ADDR_LINKLOCAL (&address->priv->addr.ipv6);
+#else
+    g_assert_not_reached ();
+#endif
 }
 
 /**
@@ -677,7 +721,11 @@ g_inet_address_get_is_site_local (GInetAddress *address)
              (addr4 & 0xffff0000) == 0xc0a80000);
     }
   else
+#ifdef HAVE_IPV6
     return IN6_IS_ADDR_SITELOCAL (&address->priv->addr.ipv6);
+#else
+    g_assert_not_reached ();
+#endif
 }
 
 /**
@@ -702,7 +750,11 @@ g_inet_address_get_is_multicast (GInetAddress *address)
       return IN_MULTICAST (addr4);
     }
   else
+#ifdef HAVE_IPV6
     return IN6_IS_ADDR_MULTICAST (&address->priv->addr.ipv6);
+#else
+    g_assert_not_reached ();
+#endif
 }
 
 /**
@@ -723,7 +775,11 @@ g_inet_address_get_is_mc_global (GInetAddress *address)
   if (address->priv->family == AF_INET)
     return FALSE;
   else
+#ifdef HAVE_IPV6
     return IN6_IS_ADDR_MC_GLOBAL (&address->priv->addr.ipv6);
+#else
+    g_assert_not_reached ();
+#endif
 }
 
 /**
@@ -744,7 +800,11 @@ g_inet_address_get_is_mc_link_local (GInetAddress *address)
   if (address->priv->family == AF_INET)
     return FALSE;
   else
+#ifdef HAVE_IPV6
     return IN6_IS_ADDR_MC_LINKLOCAL (&address->priv->addr.ipv6);
+#else
+    g_assert_not_reached ();
+#endif
 }
 
 /**
@@ -765,7 +825,11 @@ g_inet_address_get_is_mc_node_local (GInetAddress *address)
   if (address->priv->family == AF_INET)
     return FALSE;
   else
+#ifdef HAVE_IPV6
     return IN6_IS_ADDR_MC_NODELOCAL (&address->priv->addr.ipv6);
+#else
+    g_assert_not_reached ();
+#endif
 }
 
 /**
@@ -786,7 +850,11 @@ g_inet_address_get_is_mc_org_local  (GInetAddress *address)
   if (address->priv->family == AF_INET)
     return FALSE;
   else
+#ifdef HAVE_IPV6
     return IN6_IS_ADDR_MC_ORGLOCAL (&address->priv->addr.ipv6);
+#else
+    g_assert_not_reached ();
+#endif
 }
 
 /**
@@ -807,7 +875,11 @@ g_inet_address_get_is_mc_site_local (GInetAddress *address)
   if (address->priv->family == AF_INET)
     return FALSE;
   else
+#ifdef HAVE_IPV6
     return IN6_IS_ADDR_MC_SITELOCAL (&address->priv->addr.ipv6);
+#else
+    g_assert_not_reached ();
+#endif
 }
 
 /**
diff --git a/meson.build b/meson.build
index 00c4789e9..d0c531659 100644
--- a/meson.build
+++ b/meson.build
@@ -1757,6 +1757,13 @@ foreach d : inet_defines
   glibconfig_conf.set(d[1], val)
 endforeach
 
+if host_system == 'windows'
+  have_ipv6 = true
+else
+  have_ipv6 = cc.has_type('struct in6_addr', prefix: '#include <netinet/in.h>')
+endif
+glib_conf.set('HAVE_IPV6', have_ipv6)
+
 # We need to decide at configure time if GLib will use real atomic
 # operations ("lock free") or emulated ones with a mutex.  This is
 # because we must put this information in glibconfig.h so we know if


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]