summaryrefslogtreecommitdiff
path: root/dbus/dbus-sysdeps.c
diff options
context:
space:
mode:
authorSimon McVittie <smcv@collabora.com>2018-03-08 13:36:17 +0000
committerSimon McVittie <smcv@collabora.com>2018-03-09 12:27:31 +0000
commite894c94562af3e9a340a3fa931f499b827171e24 (patch)
treedd19824b54da649e158408dda3debe8c7c4f90f4 /dbus/dbus-sysdeps.c
parentabb4d1a87b4014de57ee6bde40d5d99239fb2292 (diff)
sysdeps-unix: Set more specific IP-related errors when listening
When we have resolved a hostname/port pair to a list of IPv4 or IPv6 addresses, if we are unable to listen on a a specific one of those addresses, we should report which one. When IPv6 is disabled for the loopback interface, this changes the diagnostic from: Failed to bind socket "localhost:1234": Cannot assign requested address to the more informative Failed to bind socket "::1" port 1234: Cannot assign requested address Signed-off-by: Simon McVittie <smcv@collabora.com> Reviewed-by: Ralf Habacker <ralf.habacker@freenet.de> Bug: https://bugs.freedesktop.org/show_bug.cgi?id=61922
Diffstat (limited to 'dbus/dbus-sysdeps.c')
-rw-r--r--dbus/dbus-sysdeps.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/dbus/dbus-sysdeps.c b/dbus/dbus-sysdeps.c
index f15e556f..43fa109f 100644
--- a/dbus/dbus-sysdeps.c
+++ b/dbus/dbus-sysdeps.c
@@ -870,6 +870,44 @@ _dbus_inet_sockaddr_to_string (const void *sockaddr_pointer,
}
}
+/*
+ * Format an error appropriate for saved_errno for the IPv4 or IPv6
+ * address pointed to by sockaddr_pointer of length sockaddr_len.
+ *
+ * @param error The error to set
+ * @param sockaddr_pointer A struct sockaddr_in or struct sockaddr_in6
+ * @param len The length of the struct pointed to by sockaddr_pointer
+ * @param description A prefix like "Failed to listen on socket"
+ * @param saved_errno The OS-level error number to use
+ */
+void
+_dbus_set_error_with_inet_sockaddr (DBusError *error,
+ const void *sockaddr_pointer,
+ size_t len,
+ const char *description,
+ int saved_errno)
+{
+ char string[INET6_ADDRSTRLEN];
+ dbus_uint16_t port;
+ const struct sockaddr *addr = sockaddr_pointer;
+
+ if (_dbus_inet_sockaddr_to_string (sockaddr_pointer, len,
+ string, sizeof (string), NULL, &port,
+ NULL))
+ {
+ dbus_set_error (error, _dbus_error_from_errno (saved_errno),
+ "%s \"%s\" port %u: %s",
+ description, string, port, _dbus_strerror (saved_errno));
+ }
+ else
+ {
+ dbus_set_error (error, _dbus_error_from_errno (saved_errno),
+ "%s <address of unknown family %d>: %s",
+ description, addr->sa_family,
+ _dbus_strerror (saved_errno));
+ }
+}
+
/** @} end of sysdeps */
/* tests in dbus-sysdeps-util.c */