From ffb5f8b10191ddf51ccd021c1e4dbba4eafbc370 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 13 Jan 2012 13:01:35 +0100 Subject: [PATCH] GSocket: Add function to set/get the broadcast setting on a socket https://bugzilla.gnome.org/show_bug.cgi?id=623187 --- docs/reference/gio/gio-sections.txt | 2 + gio/gio.symbols | 2 + gio/gsocket.c | 94 +++++++++++++++++++++++++++++++++++++ gio/gsocket.h | 4 ++ 4 files changed, 102 insertions(+) diff --git a/docs/reference/gio/gio-sections.txt b/docs/reference/gio/gio-sections.txt index b370044..3da75ef 100644 --- a/docs/reference/gio/gio-sections.txt +++ b/docs/reference/gio/gio-sections.txt @@ -1816,6 +1816,8 @@ g_socket_get_timeout g_socket_set_timeout g_socket_set_ttl g_socket_get_ttl +g_socket_get_broadcast +g_socket_set_broadcast g_socket_get_family g_socket_get_fd g_socket_get_local_address diff --git a/gio/gio.symbols b/gio/gio.symbols index 47347da..d1e3ff8 100644 --- a/gio/gio.symbols +++ b/gio/gio.symbols @@ -950,6 +950,7 @@ g_socket_condition_wait g_socket_connect g_socket_create_source g_socket_get_blocking +g_socket_get_broadcast g_socket_get_family g_socket_get_fd g_socket_get_timeout @@ -978,6 +979,7 @@ g_socket_send_message g_socket_send_to g_socket_send_with_blocking g_socket_set_blocking +g_socket_set_broadcast g_socket_set_timeout g_socket_set_ttl g_socket_set_keepalive diff --git a/gio/gsocket.c b/gio/gsocket.c index 49e4194..196c842 100644 --- a/gio/gsocket.c +++ b/gio/gsocket.c @@ -139,6 +139,7 @@ enum PROP_REMOTE_ADDRESS, PROP_TIMEOUT, PROP_TTL, + PROP_BROADCAST, PROP_MULTICAST_LOOPBACK, PROP_MULTICAST_TTL }; @@ -620,6 +621,10 @@ g_socket_get_property (GObject *object, g_value_set_uint (value, g_socket_get_ttl (socket)); break; + case PROP_BROADCAST: + g_value_set_boolean (value, g_socket_get_broadcast (socket)); + break; + case PROP_MULTICAST_LOOPBACK: g_value_set_boolean (value, g_socket_get_multicast_loopback (socket)); break; @@ -679,6 +684,10 @@ g_socket_set_property (GObject *object, g_socket_set_ttl (socket, g_value_get_uint (value)); break; + case PROP_BROADCAST: + g_socket_set_broadcast (socket, g_value_get_boolean (value)); + break; + case PROP_MULTICAST_LOOPBACK: g_socket_set_multicast_loopback (socket, g_value_get_boolean (value)); break; @@ -846,6 +855,21 @@ g_socket_class_init (GSocketClass *klass) G_PARAM_STATIC_STRINGS)); /** + * GSocket:broadcast: + * + * Whether the socket should allow sending to and receiving from broadcast addresses. + * + * Since: 2.32 + */ + g_object_class_install_property (gobject_class, PROP_BROADCAST, + g_param_spec_boolean ("broadcast", + P_("Broadcast"), + P_("Whether to allow sending to and receiving from broadcast addresses"), + FALSE, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + /** * GSocket:ttl: * * Time-to-live for outgoing unicast packets @@ -1326,6 +1350,76 @@ g_socket_set_ttl (GSocket *socket, } /** + * g_socket_get_broadcast: + * @socket: a #GSocket. + * + * Gets the broadcast setting on @socket; if %TRUE, + * it is possible to send packets to broadcast + * addresses or receive from broadcast addresses. + * + * Returns: the broadcast setting on @socket + * + * Since: 2.32 + */ +gboolean +g_socket_get_broadcast (GSocket *socket) +{ + int result; + guint value = 0, optlen; + + g_return_val_if_fail (G_IS_SOCKET (socket), FALSE); + + optlen = sizeof (guchar); + result = getsockopt (socket->priv->fd, SOL_SOCKET, SO_BROADCAST, + &value, &optlen); + + if (result < 0) + { + int errsv = get_socket_errno (); + g_warning ("error getting broadcast: %s", socket_strerror (errsv)); + return FALSE; + } + + return !!value; +} + +/** + * g_socket_set_broadcast: + * @socket: a #GSocket. + * @loopback: whether @socket should allow sending to and receiving + * from broadcast addresses + * + * Sets whether @socket should allow sending to and receiving from + * broadcast addresses. This is %FALSE by default. + * + * Since: 2.32 + */ +void +g_socket_set_broadcast (GSocket *socket, + gboolean broadcast) +{ + int result; + guchar value; + + g_return_if_fail (G_IS_SOCKET (socket)); + + broadcast = !!broadcast; + value = (guchar)broadcast; + + result = setsockopt (socket->priv->fd, SOL_SOCKET, SO_BROADCAST, + &value, sizeof (value)); + + if (result < 0) + { + int errsv = get_socket_errno (); + g_warning ("error setting broadcast: %s", socket_strerror (errsv)); + return; + } + + g_object_notify (G_OBJECT (socket), "broadcast"); +} + +/** * g_socket_get_multicast_loopback: * @socket: a #GSocket. * diff --git a/gio/gsocket.h b/gio/gsocket.h index 30f1816..94b4ce1 100644 --- a/gio/gsocket.h +++ b/gio/gsocket.h @@ -105,6 +105,10 @@ guint g_socket_get_ttl (GSocket void g_socket_set_ttl (GSocket *socket, guint ttl); +gboolean g_socket_get_broadcast (GSocket *socket); +void g_socket_set_broadcast (GSocket *socket, + gboolean broadcast); + gboolean g_socket_get_multicast_loopback (GSocket *socket); void g_socket_set_multicast_loopback (GSocket *socket, gboolean loopback); -- 2.7.4