From: Zbigniew Jędrzejewski-Szmek Date: Wed, 14 Oct 2020 10:15:58 +0000 (+0200) Subject: sd-bus: add custom return code when $XDG_RUNTIME_DIR is not set X-Git-Tag: v247-rc1~48^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ab4a88eb920e2f64a79a60c1ea9aecb7907a9635;p=thirdparty%2Fsystemd.git sd-bus: add custom return code when $XDG_RUNTIME_DIR is not set We would return ENOENT, which is extremely confusing. Strace is not helpful because no *file* is actually missing. So let's add some logs at debug level and also use a custom return code. Let all user-facing utilities print a custom error message in that case. --- diff --git a/man/sd_bus_default.xml b/man/sd_bus_default.xml index 06ce1386ac7..c2187683464 100644 --- a/man/sd_bus_default.xml +++ b/man/sd_bus_default.xml @@ -276,13 +276,20 @@ Returned errors may indicate the following problems: - -EINVAL The specified parameters are invalid. + + -ENOMEDIUM + + The requested bus type is not available because of invalid environment (for example + the user session bus is not available because $XDG_RUNTIME_DIR is not set). + + + -ENOMEM diff --git a/src/busctl/busctl.c b/src/busctl/busctl.c index 4d98941d748..446e4741129 100644 --- a/src/busctl/busctl.c +++ b/src/busctl/busctl.c @@ -129,11 +129,11 @@ static int acquire_bus(bool set_monitor, sd_bus **ret) { } } if (r < 0) - return log_error_errno(r, "Failed to set address: %m"); + return bus_log_address_error(r); r = sd_bus_start(bus); if (r < 0) - return log_error_errno(r, "Failed to connect to bus: %m"); + return bus_log_connect_error(r); *ret = TAKE_PTR(bus); diff --git a/src/home/homectl.c b/src/home/homectl.c index 4629499504c..486aec066d6 100644 --- a/src/home/homectl.c +++ b/src/home/homectl.c @@ -99,7 +99,7 @@ static int acquire_bus(sd_bus **bus) { r = bus_connect_transport(arg_transport, arg_host, false, bus); if (r < 0) - return log_error_errno(r, "Failed to connect to bus: %m"); + return bus_log_connect_error(r); (void) sd_bus_set_allow_interactive_authorization(*bus, arg_ask_password); diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c index c602088cf8d..daae8aaa6a3 100644 --- a/src/libsystemd/sd-bus/sd-bus.c +++ b/src/libsystemd/sd-bus/sd-bus.c @@ -1340,7 +1340,8 @@ int bus_set_address_user(sd_bus *b) { e = secure_getenv("XDG_RUNTIME_DIR"); if (!e) - return -ENOENT; + return log_debug_errno(SYNTHETIC_ERRNO(ENOMEDIUM), + "sd-bus: $XDG_RUNTIME_DIR not set, cannot connect to user bus."); ee = bus_address_escape(e); if (!ee) diff --git a/src/libsystemd/sd-bus/test-bus-cleanup.c b/src/libsystemd/sd-bus/test-bus-cleanup.c index 99d335e3fce..86a2407507e 100644 --- a/src/libsystemd/sd-bus/test-bus-cleanup.c +++ b/src/libsystemd/sd-bus/test-bus-cleanup.c @@ -23,7 +23,7 @@ static int test_bus_open(void) { int r; r = sd_bus_open_user(&bus); - if (IN_SET(r, -ECONNREFUSED, -ENOENT)) { + if (IN_SET(r, -ECONNREFUSED, -ENOENT, -ENOMEDIUM)) { r = sd_bus_open_system(&bus); if (IN_SET(r, -ECONNREFUSED, -ENOENT)) return r; diff --git a/src/libsystemd/sd-bus/test-bus-track.c b/src/libsystemd/sd-bus/test-bus-track.c index 68a00103688..5adcf948ddb 100644 --- a/src/libsystemd/sd-bus/test-bus-track.c +++ b/src/libsystemd/sd-bus/test-bus-track.c @@ -55,7 +55,7 @@ int main(int argc, char *argv[]) { assert_se(r >= 0); r = sd_bus_open_user(&a); - if (IN_SET(r, -ECONNREFUSED, -ENOENT)) { + if (IN_SET(r, -ECONNREFUSED, -ENOENT, -ENOMEDIUM)) { r = sd_bus_open_system(&a); if (IN_SET(r, -ECONNREFUSED, -ENOENT)) return log_tests_skipped("Failed to connect to bus"); diff --git a/src/login/inhibit.c b/src/login/inhibit.c index e3866eee55a..399f70fbc76 100644 --- a/src/login/inhibit.c +++ b/src/login/inhibit.c @@ -282,7 +282,7 @@ static int run(int argc, char *argv[]) { r = sd_bus_default_system(&bus); if (r < 0) - return log_error_errno(r, "Failed to connect to bus: %m"); + return bus_log_connect_error(r); if (arg_action == ACTION_LIST) return print_inhibitors(bus); diff --git a/src/portable/portablectl.c b/src/portable/portablectl.c index 4369dfd1563..7a4f60163e1 100644 --- a/src/portable/portablectl.c +++ b/src/portable/portablectl.c @@ -178,7 +178,7 @@ static int acquire_bus(sd_bus **bus) { r = bus_connect_transport(arg_transport, arg_host, false, bus); if (r < 0) - return log_error_errno(r, "Failed to connect to bus: %m"); + return bus_log_connect_error(r); (void) sd_bus_set_allow_interactive_authorization(*bus, arg_ask_password); diff --git a/src/shared/bus-util.h b/src/shared/bus-util.h index 9b86f9526e0..1a1389fd1e8 100644 --- a/src/shared/bus-util.h +++ b/src/shared/bus-util.h @@ -38,13 +38,19 @@ int bus_connect_user_systemd(sd_bus **_bus); int bus_connect_transport(BusTransport transport, const char *host, bool user, sd_bus **bus); int bus_connect_transport_systemd(BusTransport transport, const char *host, bool user, sd_bus **bus); -#define bus_log_connect_error(r) \ - log_error_errno(r, "Failed to create bus connection: %m") - -#define bus_log_parse_error(r) \ +#define bus_log_address_error(r) \ + log_error_errno(r, \ + r == -ENOMEDIUM ? "Failed to set bus address: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined" : \ + "Failed to set bus address: %m") +#define bus_log_connect_error(r) \ + log_error_errno(r, \ + r == -ENOMEDIUM ? "Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined" : \ + "Failed to connect to bus: %m") + +#define bus_log_parse_error(r) \ log_error_errno(r, "Failed to parse bus message: %m") -#define bus_log_create_error(r) \ +#define bus_log_create_error(r) \ log_error_errno(r, "Failed to create bus message: %m") int bus_path_encode_unique(sd_bus *b, const char *prefix, const char *sender_id, const char *external_id, char **ret_path); diff --git a/src/systemctl/systemctl-util.c b/src/systemctl/systemctl-util.c index db1888956fb..603b1ea4fc4 100644 --- a/src/systemctl/systemctl-util.c +++ b/src/systemctl/systemctl-util.c @@ -52,7 +52,7 @@ int acquire_bus(BusFocus focus, sd_bus **ret) { else r = bus_connect_transport(arg_transport, arg_host, user, &buses[focus]); if (r < 0) - return log_error_errno(r, "Failed to connect to bus: %m"); + return bus_log_connect_error(r); (void) sd_bus_set_allow_interactive_authorization(buses[focus], arg_ask_password); }