[glib] GSocket: Add function to set/get the broadcast setting on a socket



commit ffb5f8b10191ddf51ccd021c1e4dbba4eafbc370
Author: Sebastian DrÃge <sebastian droege collabora co uk>
Date:   Fri Jan 13 13:01:35 2012 +0100

    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(+), 0 deletions(-)
---
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);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]