diff --git a/docs/reference/gio/gio-sections.txt b/docs/reference/gio/gio-sections.txt index aa5723be3..278a9cdca 100644 --- a/docs/reference/gio/gio-sections.txt +++ b/docs/reference/gio/gio-sections.txt @@ -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 GSocketClass G_IS_SOCKET diff --git a/gio/gio.symbols b/gio/gio.symbols index 89a2e1837..a0e96dd01 100644 --- a/gio/gio.symbols +++ b/gio/gio.symbols @@ -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 diff --git a/gio/gsocket.c b/gio/gsocket.c index 7aacf76e4..f352bf755 100644 --- a/gio/gsocket.c +++ b/gio/gsocket.c @@ -1277,6 +1277,54 @@ g_socket_bind (GSocket *socket, return TRUE; } +/** + * 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. diff --git a/gio/gsocket.h b/gio/gsocket.h index 2ca90d287..05d5d37fd 100644 --- a/gio/gsocket.h +++ b/gio/gsocket.h @@ -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