#include "signal.h" #include #include sig_atomic_t signal_running; sig_atomic_t signal_update; static void 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_sd; struct sigaction action_wake; signal_running = 1; signal_update = 0; 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 = add_signal(&action_sd, SIGTERM); if(rc < 0) return rc; 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; }