diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2020-03-05 17:24:19 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-05 17:24:19 +0100 |
commit | eda0cbf07186d16a160bd1d810613586fdbdf587 (patch) | |
tree | 10ffa5168ce7ec55004bd42781bd07f7402634ba | |
parent | 412be51fe8f36d48a7d2930a7f51a3e6eec17029 (diff) | |
download | systemd-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.c | 10 | ||||
-rw-r--r-- | src/core/service.c | 14 | ||||
-rw-r--r-- | src/core/unit.h | 3 |
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 */ |