summaryrefslogtreecommitdiff
path: root/libsoup/soup-socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsoup/soup-socket.c')
-rw-r--r--libsoup/soup-socket.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/libsoup/soup-socket.c b/libsoup/soup-socket.c
index e0748fd1..abde9b44 100644
--- a/libsoup/soup-socket.c
+++ b/libsoup/soup-socket.c
@@ -48,6 +48,7 @@ enum {
PROP_LOCAL_ADDRESS,
PROP_REMOTE_ADDRESS,
PROP_NON_BLOCKING,
+ PROP_IPV6_ONLY,
PROP_IS_SERVER,
PROP_SSL_CREDENTIALS,
PROP_SSL_STRICT,
@@ -74,6 +75,7 @@ typedef struct {
GProxyResolver *proxy_resolver;
guint non_blocking:1;
+ guint ipv6_only:1;
guint is_server:1;
guint ssl:1;
guint ssl_strict:1;
@@ -201,6 +203,9 @@ soup_socket_set_property (GObject *object, guint prop_id,
case PROP_NON_BLOCKING:
priv->non_blocking = g_value_get_boolean (value);
break;
+ case PROP_IPV6_ONLY:
+ priv->ipv6_only = g_value_get_boolean (value);
+ break;
case PROP_SSL_CREDENTIALS:
priv->ssl_creds = g_value_get_pointer (value);
break;
@@ -251,6 +256,9 @@ soup_socket_get_property (GObject *object, guint prop_id,
case PROP_NON_BLOCKING:
g_value_set_boolean (value, priv->non_blocking);
break;
+ case PROP_IPV6_ONLY:
+ g_value_set_boolean (value, priv->ipv6_only);
+ break;
case PROP_IS_SERVER:
g_value_set_boolean (value, priv->is_server);
break;
@@ -463,6 +471,13 @@ soup_socket_class_init (SoupSocketClass *socket_class)
"Whether or not the socket uses non-blocking I/O",
TRUE,
G_PARAM_READWRITE));
+ g_object_class_install_property (
+ object_class, PROP_IPV6_ONLY,
+ g_param_spec_boolean (SOUP_SOCKET_IPV6_ONLY,
+ "IPv6 only",
+ "IPv6 only",
+ FALSE,
+ G_PARAM_READWRITE));
/**
* SOUP_SOCKET_IS_SERVER:
*
@@ -1056,6 +1071,17 @@ soup_socket_listen (SoupSocket *sock)
goto cant_listen;
finish_socket_setup (priv);
+#if defined (IPPROTO_IPV6) && defined (IPV6_V6ONLY)
+ if (priv->ipv6_only) {
+ int fd, v6_only;
+
+ fd = g_socket_get_fd (priv->gsock);
+ v6_only = TRUE;
+ setsockopt (fd, IPPROTO_IPV6, IPV6_V6ONLY,
+ &v6_only, sizeof (v6_only));
+ }
+#endif
+
/* Bind */
if (!g_socket_bind (priv->gsock, addr, TRUE, NULL))
goto cant_listen;