diff options
author | Simon McVittie <smcv@collabora.com> | 2018-03-08 13:36:17 +0000 |
---|---|---|
committer | Simon McVittie <smcv@collabora.com> | 2018-03-09 12:27:31 +0000 |
commit | e894c94562af3e9a340a3fa931f499b827171e24 (patch) | |
tree | dd19824b54da649e158408dda3debe8c7c4f90f4 /dbus/dbus-sysdeps.c | |
parent | abb4d1a87b4014de57ee6bde40d5d99239fb2292 (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.c | 38 |
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 */ |