X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fjob.c;h=85f77e8f0d8335959cbb26a23648f2bf237313b2;hp=90de550016ff22cbf34600e66f597c72467c33b2;hb=c2756a68401102786be343712c0c35acbd73d28d;hpb=37d3ab1b7e114f0fb6dfb2e7273569b42794b76a diff --git a/src/core/job.c b/src/core/job.c index 90de55001..85f77e8f0 100644 --- a/src/core/job.c +++ b/src/core/job.c @@ -569,7 +569,7 @@ int job_run_and_invalidate(Job *j) { return r; } -static const char *job_get_status_message_format(Unit *u, JobType t, JobResult result) { +_pure_ static const char *job_get_status_message_format(Unit *u, JobType t, JobResult result) { const UnitStatusMessageFormats *format_table; assert(u); @@ -588,7 +588,7 @@ static const char *job_get_status_message_format(Unit *u, JobType t, JobResult r return NULL; } -static const char *job_get_status_message_format_try_harder(Unit *u, JobType t, JobResult result) { +_pure_ static const char *job_get_status_message_format_try_harder(Unit *u, JobType t, JobResult result) { const char *format; assert(u); @@ -644,7 +644,7 @@ static void job_print_status_message(Unit *u, JobType t, JobResult result) { case JOB_DONE: if (u->condition_result) - unit_status_printf(u, ANSI_HIGHLIGHT_GREEN_ON " OK " ANSI_HIGHLIGHT_OFF, format); + unit_status_printf(u, ANSI_GREEN_ON " OK " ANSI_HIGHLIGHT_OFF, format); break; case JOB_FAILED: @@ -678,7 +678,7 @@ static void job_print_status_message(Unit *u, JobType t, JobResult result) { case JOB_DONE: case JOB_FAILED: - unit_status_printf(u, ANSI_HIGHLIGHT_GREEN_ON " OK " ANSI_HIGHLIGHT_OFF, format); + unit_status_printf(u, ANSI_GREEN_ON " OK " ANSI_HIGHLIGHT_OFF, format); break; default: @@ -840,9 +840,11 @@ int job_finish_and_invalidate(Job *j, JobResult result, bool recursive) { job_result_to_string(result), NULL); - unit_trigger_on_failure(u); + unit_start_on_failure(u); } + unit_trigger_notify(u); + finish: /* Try to start the next jobs that can be started */ SET_FOREACH(other, u->dependencies[UNIT_AFTER], i) @@ -858,10 +860,12 @@ finish: } int job_start_timer(Job *j) { - struct itimerspec its; - struct epoll_event ev; + struct itimerspec its = {}; + struct epoll_event ev = { + .data.ptr = &j->timer_watch, + .events = EPOLLIN, + }; int fd, r; - assert(j); if (j->unit->job_timeout <= 0 || j->timer_watch.type == WATCH_JOB_TIMER) @@ -874,7 +878,6 @@ int job_start_timer(Job *j) { goto fail; } - zero(its); timespec_store(&its.it_value, j->unit->job_timeout); if (timerfd_settime(fd, 0, &its, NULL) < 0) { @@ -882,10 +885,6 @@ int job_start_timer(Job *j) { goto fail; } - zero(ev); - ev.data.ptr = &j->timer_watch; - ev.events = EPOLLIN; - if (epoll_ctl(j->manager->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0) { r = -errno; goto fail; @@ -1064,15 +1063,14 @@ int job_deserialize(Job *j, FILE *f, FDSet *fds) { } int job_coldplug(Job *j) { - struct epoll_event ev; + struct epoll_event ev = { + .data.ptr = &j->timer_watch, + .events = EPOLLIN, + }; if (j->timer_watch.type != WATCH_JOB_TIMER) return 0; - zero(ev); - ev.data.ptr = &j->timer_watch; - ev.events = EPOLLIN; - if (epoll_ctl(j->manager->epoll_fd, EPOLL_CTL_ADD, j->timer_watch.fd, &ev) < 0) return -errno; @@ -1090,10 +1088,13 @@ void job_shutdown_magic(Job *j) { * asynchronous sync() would cause their exit to be * delayed. */ - if (!unit_has_name(j->unit, SPECIAL_SHUTDOWN_TARGET)) + if (j->type != JOB_START) return; - if (j->type != JOB_START) + if (j->unit->manager->running_as != SYSTEMD_SYSTEM) + return; + + if (!unit_has_name(j->unit, SPECIAL_SHUTDOWN_TARGET)) return; if (detect_container(NULL) > 0)