diff --git a/pclsync/psignal.c b/pclsync/psignal.c index b23795d..10fabe6 100644 --- a/pclsync/psignal.c +++ b/pclsync/psignal.c @@ -5,6 +5,8 @@ #include #include #include +#include +#include #define PSIGNAL_MAX_CLEANUPS 16 static void (*cleanup_fns[PSIGNAL_MAX_CLEANUPS])(void); @@ -129,3 +131,40 @@ int psignal_check_pending(void) { } return 0; } + +int psignal_init_signalfd(void) { + sigset_t mask; + sigemptyset(&mask); + sigaddset(&mask, SIGTERM); + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGHUP); + + if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) + return -1; + + int fd = signalfd(-1, &mask, SFD_NONBLOCK | SFD_CLOEXEC); + return fd; +} + +int psignal_read_signalfd(int fd) { + struct signalfd_siginfo fdsi; + ssize_t s = read(fd, &fdsi, sizeof(struct signalfd_siginfo)); + + if (s != sizeof(struct signalfd_siginfo)) { + if (s == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) + return 0; + return -1; + } + + int signum = fdsi.ssi_signo; + + if (signum == SIGINT) { + sigint_flag = 1; + } else if (signum == SIGTERM) { + sigterm_flag = 1; + } else if (signum == SIGHUP) { + sighup_flag = 1; + } + + return signum; +} diff --git a/pclsync/psignal.h b/pclsync/psignal.h index 2bbb681..b0e14f2 100644 --- a/pclsync/psignal.h +++ b/pclsync/psignal.h @@ -12,6 +12,8 @@ int psignal_check_pending(void); void psignal_set_custom_handler(int sig, void (*handler)(int)); void psignal_register_cleanup(void (*fn)(void)); void panic(const char *msg) __attribute__((noreturn)); +int psignal_init_signalfd(void); +int psignal_read_signalfd(int fd); #ifdef __cplusplus }