From 2fe1271d25eae0f30401fb52330db3a324504952 Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Mon, 22 Jun 2020 12:35:21 +0200 Subject: Split out signal handling to a separate file --- main.c | 168 ++--------------------------------------------------------------- 1 file changed, 4 insertions(+), 164 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index c1c9f8f..f62bbc3 100644 --- a/main.c +++ b/main.c @@ -10,14 +10,13 @@ #include #include #include -#include -#include #include #include #include #include #include "main.h" +#include "signal-handler.h" #include "uring.h" #include "config-parse.h" #include "server.h" @@ -537,26 +536,7 @@ cfg_apply() } } -struct signalfd_ev { - struct uring_task task; - struct uring_task_buf tbuf; - int pipe[2]; -}; - -static void -signalfd_free(struct uring_task *task) -{ - struct signalfd_ev *signal = container_of(task, struct signalfd_ev, task); - - assert_return(task); - - debug(DBG_SIG, "called"); - close(signal->pipe[PIPE_WR]); - cfg->signal = NULL; - xfree(signal); -} - -static void +void dump_tree() { struct server *server; @@ -568,9 +548,8 @@ dump_tree() info("Dumping Tree"); info("============"); uring_task_refdump(&cfg->task); - if (cfg->signal) - uring_task_refdump(&cfg->signal->task); uring_refdump(); + signal_refdump(); idle_refdump(); igmp_refdump(); announce_refdump(); @@ -581,145 +560,6 @@ dump_tree() info("\n\n"); } -static void -signalfd_read(struct uring_task *task, int res) -{ - struct signalfd_ev *signal = container_of(task, struct signalfd_ev, task); - struct server *server, *stmp; - static unsigned count = 0; - siginfo_t *si; - - assert_return(task); - assert_task_alive(DBG_SIG, task); - - si = (siginfo_t *)task->tbuf->buf; - if (res != sizeof(*si)) - die("error in signalfd (%i)", res); - - switch (si->si_signo) { - case SIGUSR1: { - struct dns_async *dns; - - debug(DBG_SIG, "Got a SIGUSR1"); - if (si->si_code != SI_ASYNCNL || !si->si_ptr) { - error("SIGUSR1: unexpected values in siginfo"); - goto out; - } - - dns = si->si_ptr; - if (!dns->cb) { - error("DNS callback not set"); - goto out; - } - - debug(DBG_DNS, "DNS lookup complete, dns: %p, dns->cb: %p", - dns, dns->cb); - dns->cb(dns); - break; - } - - case SIGUSR2: - debug(DBG_SIG, "got a SIGUSR2"); - dump_tree(); - break; - - case SIGTERM: - debug(DBG_SIG, "Got a SIGINT/SIGHUP"); - verbose("got a signal to quit"); - sd_notifyf(0, "STOPPING=1\nSTATUS=Received signal, exiting"); - exit(EXIT_SUCCESS); - break; - - case SIGINT: - case SIGHUP: - count++; - if (count > 5) { - dump_tree(); - exit(EXIT_FAILURE); - } - - verbose("got a signal to dump tree"); - sd_notifyf(0, "STOPPING=1\nSTATUS=Received signal, exiting"); - dump_tree(); - uring_task_destroy(&signal->task); - igmp_delete(); - announce_delete(); - idle_delete(); - server_cfg_monitor_delete(); - list_for_each_entry_safe(server, stmp, &cfg->servers, list) - server_delete(server); - uring_delete(); - return; - - default: - error("got an unknown signal: %i", si->si_signo); - break; - } - -out: - uring_tbuf_read(&signal->task, signalfd_read); -} - -static void -hack_signal_handler(int signum, siginfo_t *si, void *ucontext) -{ - ssize_t r; - - assert_return(signum > 0 && si); - - r = write(cfg->signal->pipe[PIPE_WR], si, sizeof(*si)); - if (r != sizeof(*si)) - error("write: %zi\n", r); - -} - -static void -signalfd_init() -{ - //sigset_t mask; - struct signalfd_ev *signal; - - signal = zmalloc(sizeof(*signal)); - if (!signal) - die("malloc: %m"); - - if (pipe2(signal->pipe, O_CLOEXEC) < 0) - die("pipe2: %m"); - - /* - sigfillset(&mask); - if (sigprocmask(SIG_BLOCK, &mask, NULL) < 0) - die("sigprocmask: %m"); - - sfd = signalfd(-1, &mask, SFD_CLOEXEC); - if (sfd < 0) - die("signalfd: %m"); - */ - - struct sigaction action; - sigfillset(&action.sa_mask); - action.sa_sigaction = hack_signal_handler; - action.sa_flags = SA_SIGINFO; - - sigaction(SIGINT, &action, NULL); - sigaction(SIGHUP, &action, NULL); - sigaction(SIGTERM, &action, NULL); - sigaction(SIGUSR1, &action, NULL); - sigaction(SIGUSR2, &action, NULL); - - action.sa_handler = SIG_IGN; - action.sa_flags = 0; - sigaction(SIGPIPE, &action, NULL); - - debug(DBG_SIG, "using pipe fds %i -> %i", - signal->pipe[PIPE_WR], signal->pipe[PIPE_RD]); - uring_task_init(&signal->task, "signal", uring_parent(), signalfd_free); - uring_task_set_fd(&signal->task, signal->pipe[PIPE_RD]); - uring_task_set_buf(&signal->task, &signal->tbuf); - cfg->signal = signal; - uring_tbuf_read(&signal->task, signalfd_read); -} - int main(int argc, char **argv) { @@ -750,7 +590,7 @@ main(int argc, char **argv) die("capng_apply failed"); } - signalfd_init(); + signal_init(); server_cfg_monitor_init(); -- cgit v1.2.3