diff options
Diffstat (limited to 'initd/shutdown.c')
-rw-r--r-- | initd/shutdown.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/initd/shutdown.c b/initd/shutdown.c new file mode 100644 index 0000000..45af1c2 --- /dev/null +++ b/initd/shutdown.c @@ -0,0 +1,37 @@ +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <signal.h> +#include <stdio.h> +#include <errno.h> +#include <time.h> + +#include "init.h" + +void do_shutdown(int type) +{ + struct timespec req, rem; + + print_status("sending SIGTERM to all processes", STATUS_WAIT, false); + kill(-1, SIGTERM); + + memset(&req, 0, sizeof(req)); + memset(&rem, 0, sizeof(rem)); + req.tv_sec = 5; /* TODO: make configurable? */ + + while (nanosleep(&req, &rem) != 0 && errno == EINTR) + req = rem; + + print_status("sending SIGTERM to all processes", STATUS_OK, true); + kill(-1, SIGKILL); + print_status("sending SIGKILL to remaining processes", + STATUS_OK, false); + + print_status("sync", STATUS_WAIT, false); + sync(); + print_status("sync", STATUS_OK, true); + + reboot(type); + perror("reboot system call"); + exit(EXIT_FAILURE); +} |