diff --git a/docs/reference/gio/gio-sections.txt b/docs/reference/gio/gio-sections.txt index b370044af..3da75ef4b 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 47347daf7..d1e3ff8f0 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 49e41940d..196c84295 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; @@ -845,6 +854,21 @@ g_socket_class_init (GSocketClass *klass) G_PARAM_READWRITE | 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: * @@ -1325,6 +1349,76 @@ g_socket_set_ttl (GSocket *socket, g_object_notify (G_OBJECT (socket), "ttl"); } +/** + * 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 30f1816fe..94b4ce1a7 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);