aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkremlin <ian@kremlin.cc>2014-08-05 10:30:41 +0800
committerkremlin <ian@kremlin.cc>2014-08-05 10:30:41 +0800
commita6e4b32c811a567443234a11ffdb99ec517060be (patch)
treec422a5d645c3ad3a630967bdaa8d6a5735cd0885
parent5a2ebcdb9775e789cec2d66545a581846f55d937 (diff)
downloadsystembsd-a6e4b32c811a567443234a11ffdb99ec517060be.tar
systembsd-a6e4b32c811a567443234a11ffdb99ec517060be.tar.gz
systembsd-a6e4b32c811a567443234a11ffdb99ec517060be.tar.bz2
systembsd-a6e4b32c811a567443234a11ffdb99ec517060be.tar.lz
systembsd-a6e4b32c811a567443234a11ffdb99ec517060be.tar.xz
systembsd-a6e4b32c811a567443234a11ffdb99ec517060be.tar.zst
systembsd-a6e4b32c811a567443234a11ffdb99ec517060be.zip
(6) add handler for unix termination signals
it prints a message and calls foo_mem_clean(), swiftly and safely bringing the runtime down before letting the calling thread it was ready to exit. note, this is handled through GLib which guarantees it is only fired once, rather than unwrapped signals that can occur wildly.
-rw-r--r--src/interfaces/localed/localed.c9
-rw-r--r--src/interfaces/logind/logind.c9
-rw-r--r--src/interfaces/timedated/timedated.c9
3 files changed, 27 insertions, 0 deletions
diff --git a/src/interfaces/localed/localed.c b/src/interfaces/localed/localed.c
index e2fd3f4..83c8de2 100644
--- a/src/interfaces/localed/localed.c
+++ b/src/interfaces/localed/localed.c
@@ -133,6 +133,15 @@ void localed_mem_clean() {
}
+/* wrapper for glib's unix signal handling; called only once if terminating signal is raised against us */
+gboolean unix_sig_terminate_handler(gpointer data) {
+
+ g_printf("caught SIGINT/HUP/TERM, exiting\n");
+
+ localed_mem_clean();
+ return G_SOURCE_REMOVE;
+}
+
int main() {
localed_loop = g_main_loop_new(NULL, TRUE);
diff --git a/src/interfaces/logind/logind.c b/src/interfaces/logind/logind.c
index 78775cf..a0b0343 100644
--- a/src/interfaces/logind/logind.c
+++ b/src/interfaces/logind/logind.c
@@ -133,6 +133,15 @@ void logind_mem_clean() {
}
+/* wrapper for glib's unix signal handling; called only once if terminating signal is raised against us */
+gboolean unix_sig_terminate_handler(gpointer data) {
+
+ g_printf("caught SIGINT/HUP/TERM, exiting\n");
+
+ logind_mem_clean();
+ return G_SOURCE_REMOVE;
+}
+
int main() {
logind_loop = g_main_loop_new(NULL, TRUE);
diff --git a/src/interfaces/timedated/timedated.c b/src/interfaces/timedated/timedated.c
index 72d14f8..265a33f 100644
--- a/src/interfaces/timedated/timedated.c
+++ b/src/interfaces/timedated/timedated.c
@@ -133,6 +133,15 @@ void timedated_mem_clean() {
}
+/* wrapper for glib's unix signal handling; called only once if terminating signal is raised against us */
+gboolean unix_sig_terminate_handler(gpointer data) {
+
+ g_printf("caught SIGINT/HUP/TERM, exiting\n");
+
+ timedated_mem_clean();
+ return G_SOURCE_REMOVE;
+}
+
int main() {
timedated_loop = g_main_loop_new(NULL, TRUE);