summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2020-03-05 17:24:19 +0100
committerGitHub <noreply@github.com>2020-03-05 17:24:19 +0100
commiteda0cbf07186d16a160bd1d810613586fdbdf587 (patch)
tree10ffa5168ce7ec55004bd42781bd07f7402634ba
parent412be51fe8f36d48a7d2930a7f51a3e6eec17029 (diff)
downloadsystemd-eda0cbf07186d16a160bd1d810613586fdbdf587.tar.gz
Use Finished instead of Started for Type=oneshot services (#14851)
UnitStatusMessageFormats.finished_job, if present, will be called with the same arguments as job_get_done_status_message_format() to provide a format string appropriate for the context This commit replaces "Started" with "Finished" for started oneshot units, as mentioned in the referenced issue Closes #2458.
-rw-r--r--src/core/job.c10
-rw-r--r--src/core/service.c14
-rw-r--r--src/core/unit.h3
3 files changed, 24 insertions, 3 deletions
diff --git a/src/core/job.c b/src/core/job.c
index c45171cea7..9fe30359df 100644
--- a/src/core/job.c
+++ b/src/core/job.c
@@ -797,9 +797,15 @@ _pure_ static const char *job_get_done_status_message_format(Unit *u, JobType t,
assert(t < _JOB_TYPE_MAX);
if (IN_SET(t, JOB_START, JOB_STOP, JOB_RESTART)) {
+ const UnitStatusMessageFormats *formats = &UNIT_VTABLE(u)->status_message_formats;
+ if (formats->finished_job) {
+ format = formats->finished_job(u, t, result);
+ if (format)
+ return format;
+ }
format = t == JOB_START ?
- UNIT_VTABLE(u)->status_message_formats.finished_start_job[result] :
- UNIT_VTABLE(u)->status_message_formats.finished_stop_job[result];
+ formats->finished_start_job[result] :
+ formats->finished_stop_job[result];
if (format)
return format;
}
diff --git a/src/core/service.c b/src/core/service.c
index c3f9fb4703..17f27a4abc 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -4308,6 +4308,18 @@ static int service_can_clean(Unit *u, ExecCleanMask *ret) {
return exec_context_get_clean_mask(&s->exec_context, ret);
}
+static const char *service_finished_job(Unit *u, JobType t, JobResult result) {
+ if (t == JOB_START && result == JOB_DONE) {
+ Service *s = SERVICE(u);
+
+ if (s->type == SERVICE_ONESHOT)
+ return "Finished %s.";
+ }
+
+ /* Fall back to generic */
+ return NULL;
+}
+
static const char* const service_restart_table[_SERVICE_RESTART_MAX] = {
[SERVICE_RESTART_NO] = "no",
[SERVICE_RESTART_ON_SUCCESS] = "on-success",
@@ -4455,7 +4467,6 @@ const UnitVTable service_vtable = {
[1] = "Stopping %s...",
},
.finished_start_job = {
- [JOB_DONE] = "Started %s.",
[JOB_FAILED] = "Failed to start %s.",
[JOB_SKIPPED] = "Skipped %s.",
},
@@ -4463,5 +4474,6 @@ const UnitVTable service_vtable = {
[JOB_DONE] = "Stopped %s.",
[JOB_FAILED] = "Stopped (with error) %s.",
},
+ .finished_job = service_finished_job,
},
};
diff --git a/src/core/unit.h b/src/core/unit.h
index 20d78971df..2e103f7ab2 100644
--- a/src/core/unit.h
+++ b/src/core/unit.h
@@ -382,6 +382,9 @@ typedef struct UnitStatusMessageFormats {
const char *starting_stopping[2];
const char *finished_start_job[_JOB_RESULT_MAX];
const char *finished_stop_job[_JOB_RESULT_MAX];
+ /* If this entry is present, it'll be called to provide a context-dependent format string,
+ * or NULL to fall back to finished_{start,stop}_job; if those are NULL too, fall back to generic. */
+ const char *(*finished_job)(Unit *u, JobType t, JobResult result);
} UnitStatusMessageFormats;
/* Flags used when writing drop-in files or transient unit files */