aboutsummaryrefslogtreecommitdiff
path: root/initd/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'initd/main.c')
-rw-r--r--initd/main.c23
1 files changed, 10 insertions, 13 deletions
diff --git a/initd/main.c b/initd/main.c
index 5ad265d..2d721a4 100644
--- a/initd/main.c
+++ b/initd/main.c
@@ -3,18 +3,7 @@
static void handle_signal(int signo)
{
- int status;
- pid_t pid;
-
switch (signo) {
- case SIGCHLD:
- while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
- status = WIFEXITED(status) ? WEXITSTATUS(status) :
- EXIT_FAILURE;
-
- supervisor_handle_exited(pid, status);
- }
- break;
case SIGTERM:
supervisor_set_target(TGT_SHUTDOWN);
break;
@@ -31,13 +20,14 @@ static void handle_signal(int signo)
int main(void)
{
struct sigaction act;
+ int status;
+ pid_t pid;
supervisor_init();
memset(&act, 0, sizeof(act));
act.sa_handler = handle_signal;
- sigaction(SIGCHLD, &act, NULL);
sigaction(SIGTERM, &act, NULL);
sigaction(SIGINT, &act, NULL);
sigaction(SIGHUP, &act, NULL);
@@ -50,7 +40,14 @@ int main(void)
while (supervisor_process_queues())
;
- pause();
+ pid = wait(&status);
+
+ if (pid != -1) {
+ status = WIFEXITED(status) ?
+ WEXITSTATUS(status) : EXIT_FAILURE;
+
+ supervisor_handle_exited(pid, status);
+ }
}
return EXIT_SUCCESS;