From 67de6cba508d7f2e0c310527667df2efcf4a543a Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Mon, 15 Jun 2009 14:23:57 +0200 Subject: [PATCH] Add bound address out-argument to g_socket_listener_add_address (#585566) This is very useful when binding to "any" port. --- gio/gsocketlistener.c | 20 ++++++++++++++++++++ gio/gsocketlistener.h | 1 + 2 files changed, 21 insertions(+) diff --git a/gio/gsocketlistener.c b/gio/gsocketlistener.c index ca965303e..522ed447a 100644 --- a/gio/gsocketlistener.c +++ b/gio/gsocketlistener.c @@ -250,6 +250,7 @@ g_socket_listener_add_socket (GSocketListener *listener, * @type: a #GSocketType * @protocol: a #GSocketProtocol * @source_object: Optional #GObject identifying this source + * @effective_address: location to store the address that was bound to, or %NULL. * @error: #GError for error reporting, or %NULL to ignore. * * Creates a socket of type @type and protocol @protocol, binds @@ -266,6 +267,12 @@ g_socket_listener_add_socket (GSocketListener *listener, * useful if you're listening on multiple addresses and do * different things depending on what address is connected to. * + * If successful and @effective_address is non-%NULL then it will + * be set to the address that the binding actually occured at. This + * is helpful for determining the port number that was used for when + * requesting a binding to port 0 (ie: "any port"). This address, if + * requested, belongs to the caller and must be freed. + * * Returns: %TRUE on success, %FALSE on error. * * Since: 2.22 @@ -276,8 +283,10 @@ g_socket_listener_add_address (GSocketListener *listener, GSocketType type, GSocketProtocol protocol, GObject *source_object, + GSocketAddress **effective_address, GError **error) { + GSocketAddress *local_address; GSocketFamily family; GSocket *socket; @@ -301,6 +310,17 @@ g_socket_listener_add_address (GSocketListener *listener, return FALSE; } + if (effective_address) + { + local_address = g_socket_get_local_address (socket, error); + if (local_address == NULL) + { + g_object_unref (socket); + return FALSE; + } + *effective_address = local_address; + } + if (G_SOCKET_LISTENER_GET_CLASS (listener)->changed) G_SOCKET_LISTENER_GET_CLASS (listener)->changed (listener); diff --git a/gio/gsocketlistener.h b/gio/gsocketlistener.h index 64894fb27..76cd703ba 100644 --- a/gio/gsocketlistener.h +++ b/gio/gsocketlistener.h @@ -92,6 +92,7 @@ gboolean g_socket_listener_add_address (GSocket GSocketType type, GSocketProtocol protocol, GObject *source_object, + GSocketAddress **effective_address, GError **error); gboolean g_socket_listener_add_inet_port (GSocketListener *listener, guint16 port,