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/shutdown.c |
Initial commit
Signed-off-by: David Oberhollenzer <david.oberhollenzer@tele2.at>
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); +} |