aboutsummaryrefslogtreecommitdiff
path: root/initd/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'initd/main.c')
-rw-r--r--initd/main.c104
1 files changed, 13 insertions, 91 deletions
diff --git a/initd/main.c b/initd/main.c
index dc2e631..c804105 100644
--- a/initd/main.c
+++ b/initd/main.c
@@ -1,24 +1,6 @@
/* SPDX-License-Identifier: ISC */
#include "init.h"
-/* service configurations */
-static service_list_t cfg;
-
-/* service run time data, sorted by target and topological order */
-static svc_run_data_t *rt_data = NULL;
-static size_t rt_count = 0;
-
-/* maps a target to range in rt_data */
-static size_t queue_start[TGT_MAX];
-static size_t queue_count[TGT_MAX];
-
-/* current state */
-static size_t queue_idx = 0;
-static int target = TGT_BOOT;
-static size_t singleshot = 0;
-
-/*****************************************************************************/
-
static const char *status_str[] = {
[STATE_OFF] = NULL,
[STATE_QUEUED] = NULL,
@@ -54,76 +36,23 @@ fail:
return;
}
-static void supervisor_init(void)
-{
- int status = STATE_FAILED;
- service_t *it;
- size_t i, j;
-
- if (svcscan(SVCDIR, &cfg))
- goto out;
-
- /* allocate run time data */
- rt_count = 0;
-
- for (i = 0; i < TGT_MAX; ++i) {
- for (it = cfg.targets[i]; it != NULL; it = it->next)
- ++rt_count;
- }
-
- rt_data = calloc(rt_count, sizeof(rt_data[0]));
- if (rt_data == NULL) {
- rt_count = 0;
- goto out;
- }
-
- /* map runtime data to services */
- j = 0;
-
- for (i = 0; i < TGT_MAX; ++i) {
- queue_start[i] = j;
-
- for (it = cfg.targets[i]; it != NULL; it = it->next) {
- rt_data[j].svc = it;
- rt_data[j].state = STATE_OFF;
- rt_data[j].pid = -1;
- ++j;
- }
-
- queue_count[i] = j - queue_start[i];
- }
-
- /* initialize state */
- status = STATE_COMPLETED;
-
- for (i = 0; i < queue_count[target]; ++i)
- rt_data[queue_start[target] + i].state = STATE_QUEUED;
-out:
- print_status("reading configuration from " SVCDIR, status);
-}
-
static svc_run_data_t *wait_for_process(void)
{
svc_run_data_t *rt;
int status;
pid_t pid;
- size_t i;
do {
pid = wait(&status);
- if (pid == -1)
- return NULL;
- for (i = 0; i < rt_count && rt_data[i].pid != pid; ++i)
- ;
- } while (i >= rt_count);
+ rt = config_rt_data_by_pid(pid);
+ } while (rt == NULL);
- rt = rt_data + i;
rt->status = WIFEXITED(status) ? WEXITSTATUS(status) : EXIT_FAILURE;
rt->pid = -1;
if (rt->svc->type == SVC_RESPAWN) {
- if (target != TGT_REBOOT && target != TGT_SHUTDOWN)
+ if (config_should_respawn())
respawn(rt);
} else {
if (rt->status == EXIT_SUCCESS) {
@@ -135,7 +64,7 @@ static svc_run_data_t *wait_for_process(void)
print_status(rt->svc->desc, rt->state);
if (rt->svc->type == SVC_ONCE)
- singleshot -= 1;
+ config_singleshot_terminated();
}
return rt;
@@ -145,16 +74,10 @@ static void handle_signal(int signo)
{
switch (signo) {
case SIGTERM:
- if (target != TGT_REBOOT && target != TGT_SHUTDOWN) {
- target = TGT_SHUTDOWN;
- queue_idx = 0;
- }
+ config_set_target(TGT_SHUTDOWN);
break;
case SIGINT:
- if (target != TGT_REBOOT && target != TGT_SHUTDOWN) {
- target = TGT_REBOOT;
- queue_idx = 0;
- }
+ config_set_target(TGT_REBOOT);
break;
case SIGHUP:
break;
@@ -165,10 +88,10 @@ static void handle_signal(int signo)
static void check_target_completion(void)
{
- if (singleshot > 0 || queue_idx < queue_count[target])
+ if (!config_is_current_target_complete())
return;
- switch (target) {
+ switch (config_get_current_target()) {
case TGT_BOOT:
break;
case TGT_SHUTDOWN:
@@ -187,9 +110,9 @@ int main(void)
svc_run_data_t *rt, *terminated;
struct sigaction act;
service_t *svc;
- size_t count;
- supervisor_init();
+ if (config_load())
+ return EXIT_FAILURE;
memset(&act, 0, sizeof(act));
act.sa_handler = handle_signal;
@@ -203,9 +126,9 @@ int main(void)
perror("cannot disable CTRL+ALT+DEL");
for (;;) {
- count = queue_count[target];
+ rt = config_dequeue();
- if (queue_idx >= count) {
+ if (rt == NULL) {
terminated = wait_for_process();
if (terminated != NULL)
@@ -213,7 +136,6 @@ int main(void)
continue;
}
- rt = rt_data + queue_start[target] + queue_idx++;
svc = rt->svc;
if (svc->flags & SVC_FLAG_HAS_EXEC) {
@@ -235,7 +157,7 @@ int main(void)
}
break;
case SVC_ONCE:
- singleshot += 1;
+ config_singleshot_started();
break;
}
}