add g_socket_speaks_ipv4()
authorRyan Lortie <desrt@desrt.ca>
Fri, 12 Jun 2009 16:21:07 +0000 (12:21 -0400)
committerRyan Lortie <desrt@desrt.ca>
Fri, 12 Jun 2009 16:21:07 +0000 (12:21 -0400)
Partial fix for Bug 585575.

docs/reference/gio/gio-sections.txt
gio/gio.symbols
gio/gsocket.c
gio/gsocket.h

index aa5723b..278a9cd 100644 (file)
@@ -1668,6 +1668,7 @@ g_socket_get_local_address
 g_socket_get_protocol
 g_socket_get_remote_address
 g_socket_get_socket_type
+g_socket_speaks_ipv4
 <SUBSECTION Standard>
 GSocketClass
 G_IS_SOCKET
index 89a2e18..a0e96dd 100644 (file)
@@ -1102,6 +1102,7 @@ g_socket_send_to
 g_socket_set_blocking
 g_socket_set_keepalive
 g_socket_set_listen_backlog
+g_socket_speaks_ipv4
 #endif
 #endif
 
index 7aacf76..f352bf7 100644 (file)
@@ -1278,6 +1278,54 @@ g_socket_bind (GSocket         *socket,
 }
 
 /**
+ * g_socket_speaks_ipv4:
+ * @socket: a #GSocket
+ *
+ * Checks if a socket is capable of speaking IPv4.
+ *
+ * IPv4 sockets are capable of speaking IPv4.  On some operating systems
+ * and under some combinations of circumstances IPv6 sockets are also
+ * capable of speaking IPv4.  See RFC 3493 section 3.7 for more
+ * information.
+ *
+ * No other types of sockets are currently considered as being capable
+ * of speaking IPv4.
+ *
+ * Returns: %TRUE if this socket can be used with IPv4.
+ *
+ * Since: 2.22.
+ **/
+gboolean
+g_socket_speaks_ipv4 (GSocket *socket)
+{
+  switch (socket->priv->family)
+    {
+    case G_SOCKET_FAMILY_IPV4:
+      return TRUE;
+
+    case G_SOCKET_FAMILY_IPV6:
+#if defined (IPPROTO_IPV6) && defined (IPV6_V6ONLY)
+      {
+        guint sizeof_int = sizeof (int);
+        gint v6_only;
+
+        if (getsockopt (socket->priv->fd,
+                        IPPROTO_IPV6, IPV6_V6ONLY,
+                        &v6_only, &sizeof_int) != 0)
+          return FALSE;
+
+        return !v6_only;
+      }
+#else
+      return FALSE;
+#endif
+
+    default:
+      return FALSE;
+    }
+}
+
+/**
  * g_socket_accept:
  * @socket: a #GSocket.
  * @error: #GError for error reporting, or %NULL to ignore.
index 2ca90d2..05d5d37 100644 (file)
@@ -161,6 +161,7 @@ gboolean               g_socket_is_closed               (GSocket
 GSource *              g_socket_create_source           (GSocket                 *socket,
                                                         GIOCondition             condition,
                                                         GCancellable            *cancellable);
+gboolean               g_socket_speaks_ipv4             (GSocket                 *socket);
 
 G_END_DECLS