aboutsummaryrefslogtreecommitdiff
path: root/initd/shutdown.c
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@tele2.at>2018-02-25 14:33:19 +0100
committerDavid Oberhollenzer <david.oberhollenzer@tele2.at>2018-03-24 17:04:20 +0100
commit9a88f7da453eadc72d8f333700dbd80777feecd1 (patch)
tree8a096e37123ece1d20bcb4d0ae8e064bdd39747a /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.c37
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);
+}