bd1529
From 7569756d005d4f780fffd2504eb6f461982833f2 Mon Sep 17 00:00:00 2001
bd1529
From: Lennart Poettering <lennart@poettering.net>
bd1529
Date: Sat, 13 Oct 2018 14:38:46 +0200
bd1529
Subject: [PATCH] systemctl: clean up start_unit_one() error handling
bd1529
bd1529
Let's split exit code handling in two: "r" is only used for errno-style
bd1529
errors, and "ret" is used for exit() codes. Then, let's use EXIT_SUCCESS
bd1529
for checking whether the latter is already used.
bd1529
bd1529
This way it should always be clear what kind of error we are processing,
bd1529
and when we propaate one into the other.
bd1529
bd1529
Moreover this allows us to drop "q" form all inner loops, avoiding
bd1529
confusion when to use "q" and when "r" to store received errors.
bd1529
bd1529
Fixes: #9704
bd1529
(cherry picked from commit 0e8d9c0c4d7e71487c486f626c59853cfb031d16)
bd1529
bd1529
Related: #846319
bd1529
---
bd1529
 src/systemctl/systemctl.c | 32 +++++++++++++++-----------------
bd1529
 1 file changed, 15 insertions(+), 17 deletions(-)
bd1529
bd1529
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
bd1529
index 1929692480..4af9deb98d 100644
bd1529
--- a/src/systemctl/systemctl.c
bd1529
+++ b/src/systemctl/systemctl.c
bd1529
@@ -3004,12 +3004,12 @@ static enum action verb_to_action(const char *verb) {
bd1529
 
bd1529
 static int start_unit(int argc, char *argv[], void *userdata) {
bd1529
         _cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL;
bd1529
+        _cleanup_(wait_context_free) WaitContext wait_context = {};
bd1529
         const char *method, *mode, *one_name, *suffix = NULL;
bd1529
         _cleanup_strv_free_ char **names = NULL;
bd1529
+        int r, ret = EXIT_SUCCESS;
bd1529
         sd_bus *bus;
bd1529
-        _cleanup_(wait_context_free) WaitContext wait_context = {};
bd1529
         char **name;
bd1529
-        int r = 0;
bd1529
 
bd1529
         if (arg_wait && !STR_IN_SET(argv[0], "start", "restart")) {
bd1529
                 log_error("--wait may only be used with the 'start' or 'restart' commands.");
bd1529
@@ -3096,16 +3096,15 @@ static int start_unit(int argc, char *argv[], void *userdata) {
bd1529
 
bd1529
         STRV_FOREACH(name, names) {
bd1529
                 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
bd1529
-                int q;
bd1529
 
bd1529
-                q = start_unit_one(bus, method, *name, mode, &error, w, arg_wait ? &wait_context : NULL);
bd1529
-                if (r >= 0 && q < 0)
bd1529
-                        r = translate_bus_error_to_exit_status(q, &error);
bd1529
+                r = start_unit_one(bus, method, *name, mode, &error, w, arg_wait ? &wait_context : NULL);
bd1529
+                if (ret == EXIT_SUCCESS && r < 0)
bd1529
+                        ret = translate_bus_error_to_exit_status(r, &error);
bd1529
         }
bd1529
 
bd1529
         if (!arg_no_block) {
bd1529
-                int q, arg_count = 0;
bd1529
                 const char* extra_args[4] = {};
bd1529
+                int arg_count = 0;
bd1529
 
bd1529
                 if (arg_scope != UNIT_FILE_SYSTEM)
bd1529
                         extra_args[arg_count++] = "--user";
bd1529
@@ -3119,9 +3118,9 @@ static int start_unit(int argc, char *argv[], void *userdata) {
bd1529
                         extra_args[arg_count++] = arg_host;
bd1529
                 }
bd1529
 
bd1529
-                q = bus_wait_for_jobs(w, arg_quiet, extra_args);
bd1529
-                if (q < 0)
bd1529
-                        return q;
bd1529
+                r = bus_wait_for_jobs(w, arg_quiet, extra_args);
bd1529
+                if (r < 0)
bd1529
+                        return r;
bd1529
 
bd1529
                 /* When stopping units, warn if they can still be triggered by
bd1529
                  * another active unit (socket, path, timer) */
bd1529
@@ -3130,16 +3129,15 @@ static int start_unit(int argc, char *argv[], void *userdata) {
bd1529
                                 check_triggering_units(bus, *name);
bd1529
         }
bd1529
 
bd1529
-        if (r >= 0 && arg_wait && !set_isempty(wait_context.unit_paths)) {
bd1529
-                int q;
bd1529
-                q = sd_event_loop(wait_context.event);
bd1529
-                if (q < 0)
bd1529
-                        return log_error_errno(q, "Failed to run event loop: %m");
bd1529
+        if (ret == EXIT_SUCCESS && arg_wait && !set_isempty(wait_context.unit_paths)) {
bd1529
+                r = sd_event_loop(wait_context.event);
bd1529
+                if (r < 0)
bd1529
+                        return log_error_errno(r, "Failed to run event loop: %m");
bd1529
                 if (wait_context.any_failed)
bd1529
-                        r = EXIT_FAILURE;
bd1529
+                        ret = EXIT_FAILURE;
bd1529
         }
bd1529
 
bd1529
-        return r;
bd1529
+        return ret;
bd1529
 }
bd1529
 
bd1529
 #if ENABLE_LOGIND