From ba1270008021470b2e451bce8e75053e0a00f662 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Thu, 28 Mar 2019 14:15:39 +0100 Subject: Add start/stop commands to init socket Signed-off-by: David Oberhollenzer --- initd/supervisor.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'initd/supervisor.c') diff --git a/initd/supervisor.c b/initd/supervisor.c index 871618a..53a2aec 100644 --- a/initd/supervisor.c +++ b/initd/supervisor.c @@ -38,6 +38,9 @@ static void handle_terminated_service(service_t *svc) if (target == TGT_REBOOT || target == TGT_SHUTDOWN) break; + if (svc->flags & SVC_FLAG_ADMIN_STOPPED) + break; + if (svc->rspwn_limit > 0) { svc->rspwn_limit -= 1; @@ -221,3 +224,42 @@ void supervisor_answer_status_request(int fd, const void *dst, size_t addrlen, return; init_socket_send_status(fd, dst, addrlen, ESS_NONE, NULL); } + +void supervisor_start(int id) +{ + service_t *svc; + + for (svc = completed; svc != NULL; svc = svc->next) { + if (svc->id == id) + goto found; + } + + for (svc = failed; svc != NULL; svc = svc->next) { + if (svc->id == id) + goto found; + } + return; +found: + if (svc->type == SVC_RESPAWN) + svc->rspwn_limit = 0; + + svc->flags &= ~SVC_FLAG_ADMIN_STOPPED; + svc->next = queue; + queue = svc; +} + +void supervisor_stop(int id) +{ + service_t *svc; + + for (svc = running; svc != NULL; svc = svc->next) { + if (svc->id == id) + break; + } + + if (svc != NULL) { + /* TODO: something more sophisticated? */ + svc->flags |= SVC_FLAG_ADMIN_STOPPED; + kill(svc->pid, SIGTERM); + } +} -- cgit v1.2.3