diff options
author | David Oberhollenzer <david.oberhollenzer@tele2.at> | 2018-02-25 14:33:19 +0100 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@tele2.at> | 2018-03-24 17:04:20 +0100 |
commit | 9a88f7da453eadc72d8f333700dbd80777feecd1 (patch) | |
tree | 8a096e37123ece1d20bcb4d0ae8e064bdd39747a /initd/svclist.c |
Initial commit
Signed-off-by: David Oberhollenzer <david.oberhollenzer@tele2.at>
Diffstat (limited to 'initd/svclist.c')
-rw-r--r-- | initd/svclist.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/initd/svclist.c b/initd/svclist.c new file mode 100644 index 0000000..590091e --- /dev/null +++ b/initd/svclist.c @@ -0,0 +1,43 @@ +#include "init.h" + +static service_t *running = NULL; /* currently supervised services */ +static int singleshot = 0; /* active singleshot services */ + +bool svclist_have_singleshot(void) +{ + return singleshot > 0; +} + +void svclist_add(service_t *svc) +{ + svc->next = running; + running = svc; + + if (svc->type == SVC_ONCE) + singleshot += 1; +} + +service_t *svclist_remove(pid_t pid) +{ + service_t *prev = NULL, *svc = running; + + while (svc != NULL) { + if (svc->pid == pid) { + if (prev != NULL) { + prev->next = svc->next; + } else { + running = svc->next; + } + svc->next = NULL; + + if (svc->type == SVC_ONCE) + singleshot -= 1; + break; + } + + prev = svc; + svc = svc->next; + } + + return svc; +} |