From 69cc681adb833691c5cb24cfad15ec76c35709bb Mon Sep 17 00:00:00 2001 From: Samuel Cormier-Iijima Date: Thu, 28 Feb 2008 16:45:57 -0500 Subject: [PATCH] Add reuse_address as a gobject property --- gnio/gsocket.c | 32 ++++++++++++++++++++++++++++++++ gnio/gsocket.h | 5 +++++ test/test-server.c | 2 ++ 3 files changed, 39 insertions(+) diff --git a/gnio/gsocket.c b/gnio/gsocket.c index 5361438..9e234a0 100644 --- a/gnio/gsocket.c +++ b/gnio/gsocket.c @@ -54,6 +54,7 @@ enum PROP_FD, PROP_BLOCKING, PROP_BACKLOG, + PROP_REUSE_ADDRESS, PROP_LOCAL_ADDRESS, PROP_REMOTE_ADDRESS }; @@ -63,6 +64,7 @@ struct _GSocketPrivate gint fd; gboolean blocking; gint backlog; + gboolean reuse_address; GSocketAddress *local_address; GSocketAddress *remote_address; }; @@ -86,6 +88,10 @@ g_socket_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec g_value_set_int (value, socket->priv->backlog); break; + case PROP_REUSE_ADDRESS: + g_value_set_boolean (value, socket->priv->reuse_address); + break; + case PROP_LOCAL_ADDRESS: g_value_set_object (value, socket->priv->local_address); break; @@ -118,6 +124,10 @@ g_socket_set_property (GObject *object, guint prop_id, const GValue *value, GPar socket->priv->backlog = g_value_get_int (value); break; + case PROP_REUSE_ADDRESS: + g_socket_set_reuse_address (socket, g_value_get_boolean (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -327,6 +337,28 @@ g_socket_get_blocking (GSocket *socket) return socket->priv->blocking; } +void +g_socket_set_reuse_address (GSocket *socket, + gboolean reuse) +{ + gint value = (gint) reuse; + + g_return_if_fail (G_IS_SOCKET (socket)); + + if (setsockopt (socket->priv->fd, SOL_SOCKET, SO_REUSEADDR, (gpointer) &value, sizeof (value)) < 0) + g_warning ("error setting reuse address: %s", g_strerror (errno)); + + socket->priv->reuse_address = reuse; +} + +gboolean +g_socket_get_reuse_address (GSocket *socket) +{ + g_return_val_if_fail (G_IS_SOCKET (socket), FALSE); + + return socket->priv->reuse_address; +} + GSocketAddress * g_socket_get_local_address (GSocket *socket, GError **error) diff --git a/gnio/gsocket.h b/gnio/gsocket.h index 34254d4..6ae1f81 100644 --- a/gnio/gsocket.h +++ b/gnio/gsocket.h @@ -84,6 +84,11 @@ void g_socket_set_blocking (GSocket *socket, gboolean g_socket_get_blocking (GSocket *socket); +void g_socket_set_reuse_address (GSocket *socket, + gboolean reuse); + +gboolean g_socket_get_reuse_address (GSocket *socket); + gboolean g_socket_bind (GSocket *socket, GSocketAddress *address, GError **error); diff --git a/test/test-server.c b/test/test-server.c index 1446cca..c74d289 100644 --- a/test/test-server.c +++ b/test/test-server.c @@ -62,6 +62,8 @@ int main (int argc, char *argv[]) socket = g_socket_new (G_SOCKET_DOMAIN_INET, G_SOCKET_TYPE_STREAM, NULL, NULL); + g_socket_set_reuse_address (socket, TRUE); + if (!g_socket_bind (socket, G_SOCKET_ADDRESS (g_inet_socket_address_new (G_INET_ADDRESS (g_inet4_address_from_string ("127.0.0.1")), 31882)), &error)) { g_error (error->message); return 0; -- 2.20.1