diff --git a/src/service.c b/src/service.c index 0e18c0d7..f16d3cb3 100644 --- a/src/service.c +++ b/src/service.c @@ -1886,13 +1886,8 @@ restart: switch (svc->state) { case SVC_HALTED_STATE: - if (enabled) { - if (svc_has_pre(svc)) { - svc_set_state(svc, SVC_SETUP_STATE); - service_pre_script(svc); - } else - svc_set_state(svc, SVC_READY_STATE); - } + if (enabled) + svc_set_state(svc, SVC_READY_STATE); break; case SVC_DONE_STATE: @@ -1942,7 +1937,7 @@ restart: case SVC_SETUP_STATE: if (!svc->pid) - svc_set_state(svc, SVC_READY_STATE); + svc_set_state(svc, SVC_STARTING_STATE); break; case SVC_READY_STATE: @@ -1953,22 +1948,36 @@ restart: if (sm_is_in_teardown(&sm)) break; - err = service_start(svc); - if (err) { - if (svc_is_missing(svc)) { - svc_set_state(svc, SVC_HALTED_STATE); - break; - } - (*restart_cnt)++; + if (svc_has_pre(svc)) { + svc_set_state(svc, SVC_SETUP_STATE); + service_pre_script(svc); break; } - - /* Everything went fine, clean and set state */ - svc_mark_clean(svc); - svc_set_state(svc, SVC_RUNNING_STATE); + svc_set_state(svc, SVC_STARTING_STATE); } break; + case SVC_STARTING_STATE: + if (!enabled) { + svc_set_state(svc, SVC_HALTED_STATE); + break; + } + + err = service_start(svc); + if (err) { + if (svc_is_missing(svc)) { + svc_set_state(svc, SVC_HALTED_STATE); + break; + } + (*restart_cnt)++; + break; + } + + /* Everything went fine, clean and set state */ + svc_mark_clean(svc); + svc_set_state(svc, SVC_RUNNING_STATE); + break; + case SVC_RUNNING_STATE: if (!enabled) { service_stop(svc); diff --git a/src/svc.h b/src/svc.h index 3210f4ef..66f3b626 100644 --- a/src/svc.h +++ b/src/svc.h @@ -63,6 +63,7 @@ typedef enum { SVC_SETUP_STATE, /* Running pre: script */ SVC_WAITING_STATE, /* Condition is in flux, process SIGSTOPed */ SVC_READY_STATE, /* Enabled but condition not satisfied */ + SVC_STARTING_STATE, /* Conditions OK and pre: script done, start */ SVC_RUNNING_STATE, /* Process running */ } svc_state_t;