Blob Blame History Raw
From 51f14e78a2ae0a971af1ce3cfcbbf8ca8250ca22 Mon Sep 17 00:00:00 2001
From: Anita Zhang <the.anitazha@gmail.com>
Date: Mon, 11 Jan 2021 20:04:20 -0800
Subject: [PATCH 1/3] core: update setings on the unit and job as the result of
 ExecCondition=

Update ExecCondition= to set Unit->condition_result and return JOB_DONE
in the Job results  if the check fails so as to match the current behavior
of ConditionXYZ= w.r.t units/jobs dependency checks.

Fixes: #18207
---
 src/core/job.c     |  3 +--
 src/core/service.c | 17 ++++++++++-------
 src/core/unit.c    |  2 --
 src/core/unit.h    |  1 -
 4 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/src/core/job.c b/src/core/job.c
index f3c1a02831..7d5c288ea4 100644
--- a/src/core/job.c
+++ b/src/core/job.c
@@ -882,8 +882,7 @@ static void job_log_done_status_message(Unit *u, uint32_t job_id, JobType t, Job
                 return;
 
         /* Show condition check message if the job did not actually do anything due to failed condition. */
-        if ((t == JOB_START && result == JOB_DONE && !u->condition_result) ||
-            (t == JOB_START && result == JOB_SKIPPED)) {
+        if (t == JOB_START && result == JOB_DONE && !u->condition_result) {
                 log_struct(LOG_INFO,
                            "MESSAGE=Condition check resulted in %s being skipped.", unit_status_string(u),
                            "JOB_ID=%" PRIu32, job_id,
diff --git a/src/core/service.c b/src/core/service.c
index d7bdeb7cca..3b144153f4 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -1129,8 +1129,7 @@ static void service_set_state(Service *s, ServiceState state) {
 
         unit_notify(UNIT(s), table[old_state], table[state],
                     (s->reload_result == SERVICE_SUCCESS ? 0 : UNIT_NOTIFY_RELOAD_FAILURE) |
-                    (s->will_auto_restart ? UNIT_NOTIFY_WILL_AUTO_RESTART : 0) |
-                    (s->result == SERVICE_SKIP_CONDITION ? UNIT_NOTIFY_SKIP_CONDITION : 0));
+                    (s->will_auto_restart ? UNIT_NOTIFY_WILL_AUTO_RESTART : 0));
 }
 
 static usec_t service_coldplug_timeout(Service *s) {
@@ -3546,10 +3545,6 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
         } else if (s->control_pid == pid) {
                 s->control_pid = 0;
 
-                /* ExecCondition= calls that exit with (0, 254] should invoke skip-like behavior instead of failing */
-                if (f == SERVICE_FAILURE_EXIT_CODE && s->state == SERVICE_CONDITION && status < 255)
-                        f = SERVICE_SKIP_CONDITION;
-
                 if (s->control_command) {
                         exec_status_exit(&s->control_command->exec_status, &s->exec_context, pid, code, status);
 
@@ -3557,6 +3552,15 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
                                 f = SERVICE_SUCCESS;
                 }
 
+                /* ExecCondition= calls that exit with (0, 254] should invoke skip-like behavior instead of failing */
+                if (s->state == SERVICE_CONDITION) {
+                        if (f == SERVICE_FAILURE_EXIT_CODE && status < 255) {
+                                UNIT(s)->condition_result = false;
+                                f = SERVICE_SKIP_CONDITION;
+                        } else if (f == SERVICE_SUCCESS)
+                                UNIT(s)->condition_result = true;
+                }
+
                 unit_log_process_exit(
                                 u,
                                 "Control process",
@@ -4601,7 +4605,6 @@ const UnitVTable service_vtable = {
                 },
                 .finished_start_job = {
                         [JOB_FAILED]     = "Failed to start %s.",
-                        [JOB_SKIPPED]    = "Skipped %s.",
                 },
                 .finished_stop_job = {
                         [JOB_DONE]       = "Stopped %s.",
diff --git a/src/core/unit.c b/src/core/unit.c
index 45a417a090..9614fb84aa 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -2561,8 +2561,6 @@ static bool unit_process_job(Job *j, UnitActiveState ns, UnitNotifyFlags flags)
                         if (UNIT_IS_INACTIVE_OR_FAILED(ns)) {
                                 if (ns == UNIT_FAILED)
                                         result = JOB_FAILED;
-                                else if (FLAGS_SET(flags, UNIT_NOTIFY_SKIP_CONDITION))
-                                        result = JOB_SKIPPED;
                                 else
                                         result = JOB_DONE;
 
diff --git a/src/core/unit.h b/src/core/unit.h
index 02b2b24206..f040e9dfe6 100644
--- a/src/core/unit.h
+++ b/src/core/unit.h
@@ -738,7 +738,6 @@ int unit_kill_common(Unit *u, KillWho who, int signo, pid_t main_pid, pid_t cont
 typedef enum UnitNotifyFlags {
         UNIT_NOTIFY_RELOAD_FAILURE    = 1 << 0,
         UNIT_NOTIFY_WILL_AUTO_RESTART = 1 << 1,
-        UNIT_NOTIFY_SKIP_CONDITION    = 1 << 2,
 } UnitNotifyFlags;
 
 void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, UnitNotifyFlags flags);
-- 
2.29.2