summaryrefslogtreecommitdiff
path: root/gio/gsocketlistener.c
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2009-06-15 14:23:57 +0200
committerAlexander Larsson <alexl@redhat.com>2009-06-15 14:23:57 +0200
commit67de6cba508d7f2e0c310527667df2efcf4a543a (patch)
treea6ae4b5215df8636c7caa2b9eb2b1165fba85c21 /gio/gsocketlistener.c
parent91bdccff7544ee19d329ec73db02fd5f11c617fd (diff)
downloadglib-67de6cba508d7f2e0c310527667df2efcf4a543a.tar.gz
Add bound address out-argument to g_socket_listener_add_address (#585566)
This is very useful when binding to "any" port.
Diffstat (limited to 'gio/gsocketlistener.c')
-rw-r--r--gio/gsocketlistener.c20
1 files changed, 20 insertions, 0 deletions
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);