summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-01-30 02:07:35 +0100
committerLennart Poettering <lennart@poettering.net>2010-01-30 02:07:35 +0100
commit7d55e83536b296d452829d87a93c86f867859cba (patch)
tree40d2d6e4ec9f8c8beca7862157f81ef4a38e506d
parent94f043472a5af62dc9cd5767e89ba33872212d5e (diff)
implement service type 'finish'
-rw-r--r--execute.h1
-rw-r--r--service.c22
2 files changed, 20 insertions, 3 deletions
diff --git a/execute.h b/execute.h
index fff54b120e..51c2c00760 100644
--- a/execute.h
+++ b/execute.h
@@ -102,7 +102,6 @@ typedef enum ExitStatus {
/* The LSB suggests that error codes >= 200 are "reserved". We
* use them here under the assumption that they hence are
* unused by init scripts.
- * c->
*
* http://refspecs.freestandards.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html */
diff --git a/service.c b/service.c
index b564c986b9..46066329f4 100644
--- a/service.c
+++ b/service.c
@@ -262,7 +262,8 @@ static void service_set_state(Service *s, ServiceState state) {
state != SERVICE_AUTO_RESTART)
unit_unwatch_timer(UNIT(s), &s->timer_watch);
- if (state != SERVICE_START_POST &&
+ if (state != SERVICE_START &&
+ state != SERVICE_START_POST &&
state != SERVICE_RUNNING &&
state != SERVICE_RELOAD &&
state != SERVICE_STOP &&
@@ -590,6 +591,13 @@ static void service_enter_start(Service *s) {
s->control_pid = pid;
s->control_command = s->exec_command[SERVICE_EXEC_START];
+ } else if (s->type == SERVICE_FINISH) {
+
+ /* For finishing services we wait until the start
+ * process exited, too, but it is our main process. */
+
+ s->main_pid = pid;
+ s->control_command = s->exec_command[SERVICE_EXEC_START];
} else
assert_not_reached("Unknown service type");
@@ -806,7 +814,7 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
exec_status_fill(&s->main_exec_status, pid, code, status);
s->main_pid = 0;
- if (s->type == SERVICE_SIMPLE) {
+ if (s->type == SERVICE_SIMPLE || s->type == SERVICE_FINISH) {
assert(s->exec_command[SERVICE_EXEC_START]);
s->exec_command[SERVICE_EXEC_START]->exec_status = s->main_exec_status;
}
@@ -825,6 +833,16 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
* done */
break;
+ case SERVICE_START:
+ assert(s->type == SERVICE_FINISH);
+
+ /* This was our main goal, so let's go on */
+ if (success)
+ service_enter_start_post(s);
+ else
+ service_enter_stop(s, false);
+ break;
+
case SERVICE_RUNNING:
service_enter_stop(s, success);
break;