aboutsummaryrefslogtreecommitdiff
path: root/initd/supervisor.c
diff options
context:
space:
mode:
authorDavid Oberhollenzer <goliath@infraroot.at>2019-03-28 14:15:39 +0100
committerDavid Oberhollenzer <goliath@infraroot.at>2019-03-28 15:32:10 +0100
commitba1270008021470b2e451bce8e75053e0a00f662 (patch)
tree1a33a447af83e276c7642b73f9c1bcd9fde9416b /initd/supervisor.c
parent9e7478397a6f3c7bc38be52268e805d5b094eeb2 (diff)
Add start/stop commands to init socket
Signed-off-by: David Oberhollenzer <goliath@infraroot.at>
Diffstat (limited to 'initd/supervisor.c')
-rw-r--r--initd/supervisor.c42
1 files changed, 42 insertions, 0 deletions
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);
+ }
+}