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.
<para>Returned errors may indicate the following problems:</para>
<variablelist>
-
<varlistentry>
<term><constant>-EINVAL</constant></term>
<listitem><para>The specified parameters are invalid.</para></listitem>
</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>
<term><constant>-ENOMEM</constant></term>
}
}
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);
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);
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)
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;
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");
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);
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);
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);
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);
}