/* SPDX-License-Identifier: ISC */ #include "init.h" 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; case SIGINT: supervisor_set_target(TGT_REBOOT); break; case SIGHUP: break; case SIGUSR1: break; } } void target_completed(int target) { switch (target) { case TGT_BOOT: break; case TGT_SHUTDOWN: for (;;) reboot(RB_POWER_OFF); break; case TGT_REBOOT: for (;;) reboot(RB_AUTOBOOT); break; } } int main(void) { struct sigaction act; 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); sigaction(SIGUSR1, &act, NULL); if (reboot(LINUX_REBOOT_CMD_CAD_OFF)) perror("cannot disable CTRL+ALT+DEL"); for (;;) { while (supervisor_process_queues()) ; pause(); } return EXIT_SUCCESS; }