X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=service.c;h=84077a19f1ced83a8097f08544a126647fe95448;hb=3a76266192da84f6f7b84725e7647c82f8407278;hp=d514922b6b9a9c5754e76bdf7f7350071aaeafd5;hpb=40d50879d9339e539a30e5d32234baffb732f0f9;p=elogind.git diff --git a/service.c b/service.c index d514922b6..84077a19f 100644 --- a/service.c +++ b/service.c @@ -1093,13 +1093,17 @@ static int service_coldplug(Unit *u) { s->deserialized_state == SERVICE_STOP_POST || s->deserialized_state == SERVICE_FINAL_SIGTERM || s->deserialized_state == SERVICE_FINAL_SIGKILL || - s->deserialized_state == SERVICE_AUTO_RESTART) - if ((r = unit_watch_timer(UNIT(s), - s->deserialized_state == SERVICE_AUTO_RESTART ? - s->restart_usec : - s->timeout_usec, - &s->timer_watch)) < 0) - return r; + s->deserialized_state == SERVICE_AUTO_RESTART) { + + if (s->deserialized_state == SERVICE_AUTO_RESTART || s->timeout_usec > 0) { + usec_t k; + + k = s->deserialized_state == SERVICE_AUTO_RESTART ? s->restart_usec : s->timeout_usec; + + if ((r = unit_watch_timer(UNIT(s), k, &s->timer_watch)) < 0) + return r; + } + } if ((s->deserialized_state == SERVICE_START && (s->type == SERVICE_FORKING || @@ -1222,7 +1226,7 @@ static int service_spawn( goto fail; } - if (timeout) { + if (timeout && s->timeout_usec) { if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0) goto fail; } else @@ -1314,6 +1318,7 @@ static void service_enter_dead(Service *s, bool success, bool allow_restart) { s->failure = true; if (allow_restart && + s->allow_restart && (s->restart == SERVICE_RESTART_ALWAYS || (s->restart == SERVICE_RESTART_ON_SUCCESS && !s->failure))) { @@ -1409,8 +1414,9 @@ static void service_enter_signal(Service *s, ServiceState state, bool success) { } if (sent) { - if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0) - goto fail; + if (s->timeout_usec > 0) + if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0) + goto fail; service_set_state(s, state); } else if (state == SERVICE_STOP_SIGTERM || state == SERVICE_STOP_SIGKILL) @@ -1716,6 +1722,7 @@ static int service_start(Unit *u) { s->failure = false; s->main_pid_known = false; + s->allow_restart = true; service_enter_start_pre(s); return 0; @@ -1749,6 +1756,10 @@ static int service_stop(Unit *u) { assert(s->state == SERVICE_RUNNING || s->state == SERVICE_EXITED); + /* This is a user request, so don't do restarts on this + * shutdown. */ + s->allow_restart = false; + service_enter_stop(s, true); return 0; }