mirror of
https://github.com/troglobit/finit.git
synced 2026-10-01 05:22:48 +07:00
Fix #278: enforce conditions also for running pre: scripts
The whole point of pre: scripts is that they run just before the actual run/task/service process, hence they need to be locked behind the same conditions as the process. Otherwise pre: scripts would be nothing more than plain tasks. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
+28
-19
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user