1
0
mirror of https://github.com/systemd/systemd.git synced 2025-09-02 17:49:53 +03:00

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.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2020-10-14 12:15:58 +02:00
parent 165fee860a
commit ab4a88eb92
10 changed files with 28 additions and 14 deletions

View File

@ -276,13 +276,20 @@
<para>Returned errors may indicate the following problems:</para> <para>Returned errors may indicate the following problems:</para>
<variablelist> <variablelist>
<varlistentry> <varlistentry>
<term><constant>-EINVAL</constant></term> <term><constant>-EINVAL</constant></term>
<listitem><para>The specified parameters are invalid.</para></listitem> <listitem><para>The specified parameters are invalid.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><constant>-ENOMEDIUM</constant></term>
<listitem><para>The requested bus type is not available because of invalid environment (for example
the user session bus is not available because <varname>$XDG_RUNTIME_DIR</varname> is not set).
</para></listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><constant>-ENOMEM</constant></term> <term><constant>-ENOMEM</constant></term>

View File

@ -129,11 +129,11 @@ static int acquire_bus(bool set_monitor, sd_bus **ret) {
} }
} }
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to set address: %m"); return bus_log_address_error(r);
r = sd_bus_start(bus); r = sd_bus_start(bus);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to connect to bus: %m"); return bus_log_connect_error(r);
*ret = TAKE_PTR(bus); *ret = TAKE_PTR(bus);

View File

@ -99,7 +99,7 @@ static int acquire_bus(sd_bus **bus) {
r = bus_connect_transport(arg_transport, arg_host, false, bus); r = bus_connect_transport(arg_transport, arg_host, false, bus);
if (r < 0) 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); (void) sd_bus_set_allow_interactive_authorization(*bus, arg_ask_password);

View File

@ -1340,7 +1340,8 @@ int bus_set_address_user(sd_bus *b) {
e = secure_getenv("XDG_RUNTIME_DIR"); e = secure_getenv("XDG_RUNTIME_DIR");
if (!e) 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); ee = bus_address_escape(e);
if (!ee) if (!ee)

View File

@ -23,7 +23,7 @@ static int test_bus_open(void) {
int r; int r;
r = sd_bus_open_user(&bus); 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); r = sd_bus_open_system(&bus);
if (IN_SET(r, -ECONNREFUSED, -ENOENT)) if (IN_SET(r, -ECONNREFUSED, -ENOENT))
return r; return r;

View File

@ -55,7 +55,7 @@ int main(int argc, char *argv[]) {
assert_se(r >= 0); assert_se(r >= 0);
r = sd_bus_open_user(&a); 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); r = sd_bus_open_system(&a);
if (IN_SET(r, -ECONNREFUSED, -ENOENT)) if (IN_SET(r, -ECONNREFUSED, -ENOENT))
return log_tests_skipped("Failed to connect to bus"); return log_tests_skipped("Failed to connect to bus");

View File

@ -282,7 +282,7 @@ static int run(int argc, char *argv[]) {
r = sd_bus_default_system(&bus); r = sd_bus_default_system(&bus);
if (r < 0) 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) if (arg_action == ACTION_LIST)
return print_inhibitors(bus); return print_inhibitors(bus);

View File

@ -178,7 +178,7 @@ static int acquire_bus(sd_bus **bus) {
r = bus_connect_transport(arg_transport, arg_host, false, bus); r = bus_connect_transport(arg_transport, arg_host, false, bus);
if (r < 0) 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); (void) sd_bus_set_allow_interactive_authorization(*bus, arg_ask_password);

View File

@ -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(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); int bus_connect_transport_systemd(BusTransport transport, const char *host, bool user, sd_bus **bus);
#define bus_log_connect_error(r) \ #define bus_log_address_error(r) \
log_error_errno(r, "Failed to create bus connection: %m") 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) \ #define bus_log_parse_error(r) \
log_error_errno(r, "Failed to parse bus message: %m") 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") 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); int bus_path_encode_unique(sd_bus *b, const char *prefix, const char *sender_id, const char *external_id, char **ret_path);

View File

@ -52,7 +52,7 @@ int acquire_bus(BusFocus focus, sd_bus **ret) {
else else
r = bus_connect_transport(arg_transport, arg_host, user, &buses[focus]); r = bus_connect_transport(arg_transport, arg_host, user, &buses[focus]);
if (r < 0) 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); (void) sd_bus_set_allow_interactive_authorization(buses[focus], arg_ask_password);
} }