summaryrefslogtreecommitdiff
path: root/src/signal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/signal.c')
-rw-r--r--src/signal.c54
1 files changed, 46 insertions, 8 deletions
diff --git a/src/signal.c b/src/signal.c
index e993ae3..37aa26b 100644
--- a/src/signal.c
+++ b/src/signal.c
@@ -1,8 +1,10 @@
#include "signal.h"
+#include <stdio.h>
#include <string.h>
sig_atomic_t signal_running;
+sig_atomic_t signal_update;
static void
handle_signal_shutdown(int sig)
@@ -10,25 +12,61 @@ handle_signal_shutdown(int sig)
signal_running = 0;
}
+static void
+handle_signal_wake(int sig)
+{
+ signal_update = 1;
+}
+
+static int
+add_signal(struct sigaction * action, int sig)
+{
+ int rc;
+
+ rc = sigemptyset(&action->sa_mask);
+ if(rc < 0) return rc;
+ rc = sigaction(sig, action, 0);
+ if(rc < 0) return rc;
+
+ return rc;
+}
+
+static void
+init_action(struct sigaction * action, void(*cb)(int))
+{
+ memset(action, 0, sizeof(struct sigaction));
+
+ action->sa_handler = cb;
+}
+
int
signal_setup_actions()
{
int rc;
- struct sigaction action;
+ struct sigaction action_sd;
+ struct sigaction action_wake;
signal_running = 1;
+ signal_update = 0;
- memset(&action, 0, sizeof(action));
- action.sa_handler = handle_signal_shutdown;
- rc = sigemptyset(&action.sa_mask);
+ init_action(&action_sd, handle_signal_shutdown);
+ init_action(&action_wake, handle_signal_wake);
+
+ rc = add_signal(&action_sd, SIGINT);
if(rc < 0) return rc;
- rc = sigaction(SIGINT, &action, 0);
+ rc = add_signal(&action_sd, SIGTERM);
if(rc < 0) return rc;
- rc = sigemptyset(&action.sa_mask);
- if(rc < 0) return rc;
- rc = sigaction(SIGTERM, &action, 0);
+ rc = add_signal(&action_wake, SIGUSR1);
if(rc < 0) return rc;
return rc;
}
+
+bool
+signal_should_update()
+{
+ bool r = signal_update;
+ signal_update = 0;
+ return r;
+}