]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-bus: add custom return code when $XDG_RUNTIME_DIR is not set 17344/head
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 14 Oct 2020 10:15:58 +0000 (12:15 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 14 Oct 2020 16:28:30 +0000 (18:28 +0200)
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.

man/sd_bus_default.xml
src/busctl/busctl.c
src/home/homectl.c
src/libsystemd/sd-bus/sd-bus.c
src/libsystemd/sd-bus/test-bus-cleanup.c
src/libsystemd/sd-bus/test-bus-track.c
src/login/inhibit.c
src/portable/portablectl.c
src/shared/bus-util.h
src/systemctl/systemctl-util.c

index 06ce1386ac79b380490a7b9ede40dafe025ba4a9..c21876834642d2b29bda022dc68808135d2d4a47 100644 (file)
       <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>
 
index 4d98941d748c1891ae09b536f4179810278cc7d6..446e47411295aa85a11ab3d13eab4a40ceee65d8 100644 (file)
@@ -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);
 
index 4629499504c22f5c78f1a283abda19946cf297a4..486aec066d65fab2550c2f5444a328218fee624b 100644 (file)
@@ -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);
 
index c602088cf8dbde79348b9ddb74f24e4de1943ec2..daae8aaa6a3e644db79f21f541ca7db60c82ef90 100644 (file)
@@ -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)
index 99d335e3fceb852a8556f5a68e7046da84a14a82..86a2407507ed514a67e7f4c6ad75bb49850ae68e 100644 (file)
@@ -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;
index 68a0010368833fc55180ee6795cc5ba807616872..5adcf948ddb6c8f537f9cd7677a602eb1d3c466b 100644 (file)
@@ -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");
index e3866eee55a711010362c229c8ed80b50e669aac..399f70fbc76aacf7b1a176f47d3746d48f47a6d0 100644 (file)
@@ -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);
index 4369dfd1563b8acbff9961735741aedda65cdd87..7a4f60163e15795e544df7924eb7fb06f2210163 100644 (file)
@@ -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);
 
index 9b86f9526e0c1b0049e5680c44561b7de7043288..1a1389fd1e84e291a64550d32fecbaccb85e8645 100644 (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_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);
index db1888956fb2540a75a17f5c2a7962880c4307bc..603b1ea4fc404f0fc001f81def597d776867fcee 100644 (file)
@@ -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);
         }