# #
#############################################################################*/
+#include <errno.h>
#include <stdlib.h>
+#include <string.h>
#include <systemd/sd-event.h>
sd_event* loop;
};
+static int nw_daemon_terminate(sd_event_source* source, const struct signalfd_siginfo* si,
+ void* data) {
+ DEBUG("Received signal to terminate...\n");
+
+ return sd_event_exit(sd_event_source_get_event(source), 0);
+}
+
+static int nw_daemon_reload(sd_event_source* source, const struct signalfd_siginfo* si,
+ void* data) {
+ DEBUG("Received signal to reload...\n");
+
+ // TODO
+
+ return 0;
+}
+
static int nw_daemon_setup_loop(struct nw_daemon* daemon) {
int r;
// Fetch a reference to the default event loop
r = sd_event_default(&daemon->loop);
if (r < 0) {
- ERROR("Could not setup event loop: %m\n");
+ ERROR("Could not setup event loop: %s\n", strerror(-r));
return 1;
}
// Enable the watchdog
r = sd_event_set_watchdog(daemon->loop, 1);
if (r < 0) {
- ERROR("Could not activate watchdog: %m\n");
+ ERROR("Could not activate watchdog: %s\n", strerror(-r));
+ return 1;
+ }
+
+ // Listen for SIGTERM
+ r = sd_event_add_signal(daemon->loop, NULL, SIGTERM|SD_EVENT_SIGNAL_PROCMASK,
+ nw_daemon_terminate, daemon);
+ if (r < 0) {
+ ERROR("Could not register handling SIGTERM: %s\n", strerror(-r));
+ return 1;
+ }
+
+ // Listen for SIGINT
+ r = sd_event_add_signal(daemon->loop, NULL, SIGINT|SD_EVENT_SIGNAL_PROCMASK,
+ nw_daemon_terminate, daemon);
+ if (r < 0) {
+ ERROR("Could not register handling SIGINT: %s\n", strerror(-r));
+ return 1;
+ }
+
+ // Listen for SIGHUP
+ r = sd_event_add_signal(daemon->loop, NULL, SIGHUP|SD_EVENT_SIGNAL_PROCMASK,
+ nw_daemon_reload, daemon);
+ if (r < 0) {
+ ERROR("Could not register handling SIGHUP: %s\n", strerror(-r));
return 1;
}