add g_socket_speaks_ipv4()

Partial fix for Bug 585575.
This commit is contained in:
Ryan Lortie 2009-06-12 12:21:07 -04:00
parent fd22781b18
commit f7d756f5b6
4 changed files with 51 additions and 0 deletions

View 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

View 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

View File

@ -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.

View 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