[glib/wip/smcv/diagnose-bind-failure: 3/3] gsocket: Improve diagnostics on bind() failure
- From: Simon McVittie <smcv src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/wip/smcv/diagnose-bind-failure: 3/3] gsocket: Improve diagnostics on bind() failure
- Date: Mon, 4 Nov 2019 15:09:42 +0000 (UTC)
commit e08dffb71b28ae881207f74c88a7dc637655b2dc
Author: Simon McVittie <smcv collabora com>
Date: Mon Nov 4 11:17:33 2019 +0000
gsocket: Improve diagnostics on bind() failure
This is in an attempt to diagnose GNOME/glib#1912.
Signed-off-by: Simon McVittie <smcv collabora com>
gio/gsocket.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 49 insertions(+), 1 deletion(-)
---
diff --git a/gio/gsocket.c b/gio/gsocket.c
index 66073af83..2a15bdd22 100644
--- a/gio/gsocket.c
+++ b/gio/gsocket.c
@@ -364,6 +364,50 @@ _win32_unset_event_mask (GSocket *socket, int mask)
recv (sockfd, (gpointer)buf, len, flags)
#endif
+static gchar *
+address_to_string (GSocketAddress *address)
+{
+ GString *ret = g_string_new ("");
+
+ if (G_IS_INET_SOCKET_ADDRESS (address))
+ {
+ GInetSocketAddress *isa = G_INET_SOCKET_ADDRESS (address);
+ GInetAddress *ia = g_inet_socket_address_get_address (isa);
+ GSocketFamily family = g_inet_address_get_family (ia);
+ gchar *tmp;
+
+ /* Represent IPv6 addresses in URL style:
+ * ::1 port 12345 -> [::1]:12345 */
+ if (family == G_SOCKET_FAMILY_IPV6)
+ g_string_append_c (ret, '[');
+
+ tmp = g_inet_address_to_string (ia);
+ g_string_append (ret, tmp);
+ g_free (tmp);
+
+ if (family == G_SOCKET_FAMILY_IPV6)
+ {
+ guint32 scope = g_inet_socket_address_get_scope_id (isa);
+
+ if (scope != 0)
+ g_string_append_printf (ret, "%%%u", scope);
+
+ g_string_append_c (ret, ']');
+ }
+
+ g_string_append_c (ret, ':');
+
+ g_string_append_printf (ret, "%u", g_inet_socket_address_get_port (isa));
+ }
+ else
+ {
+ /* For unknown address types, just show the type */
+ g_string_append_printf (ret, "(%s)", G_OBJECT_TYPE_NAME (address));
+ }
+
+ return g_string_free (ret, FALSE);
+}
+
static gboolean
check_socket (GSocket *socket,
GError **error)
@@ -2153,9 +2197,13 @@ g_socket_bind (GSocket *socket,
g_socket_address_get_native_size (address)) < 0)
{
int errsv = get_socket_errno ();
+ gchar *address_string = address_to_string (address);
+
g_set_error (error,
G_IO_ERROR, socket_io_error_from_errno (errsv),
- _("Error binding to address: %s"), socket_strerror (errsv));
+ _("Error binding to address %s: %s"),
+ address_string, socket_strerror (errsv));
+ g_free (address_string);
return FALSE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]