diff --git a/inc/lektor/net.h b/inc/lektor/net.h index 8759b8e402ea1c14aece87310cd61dd335103d63..386b2a1beb1c0bde2ab52dd713cbcf7a27eec246 100644 --- a/inc/lektor/net.h +++ b/inc/lektor/net.h @@ -67,8 +67,11 @@ struct lkt_state { /* For uptime */ time_t start_date; - /* Signal handlers for this server */ + /* Signal handlers for this server. + * Catch them all! */ void (*__signal_INT )(struct lkt_state *); + void (*__signal_ILL )(struct lkt_state *); + void (*__signal_QUIT)(struct lkt_state *); void (*__signal_USR1)(struct lkt_state *); void (*__signal_USR2)(struct lkt_state *); }; diff --git a/src/net/listen.c b/src/net/listen.c index 172ce3b937713223271a0282722da0bcbe7516a6..4e81d14b8d02b5631235ad35dc493d64adb16aca 100644 --- a/src/net/listen.c +++ b/src/net/listen.c @@ -794,22 +794,32 @@ redo: *******************/ static int __lkt_signal_INT = 0; /* SIGINT => close the server */ +static int __lkt_signal_QUIT = 0; /* SIGQUIT => close the server */ +static int __lkt_signal_ILL = 0; /* SIGILL => NoT veRy HappY */ static int __lkt_signal_USR1 = 0; /* SIGUSR1 => not used */ static int __lkt_signal_USR2 = 0; /* SIGUSR2 => not used */ static void __signal_handler(int sig) { - switch (sig) { - case SIGINT: - LOG_INFO("SIGNAL", "Got signal SIGINT"); - __lkt_signal_INT = 1; +#define __HANDLE(signal) \ + case SIG##signal: \ + LOG_INFO("SIGNAL", "Got signal SIG"#signal); \ + __lkt_signal_##signal = 1; \ break; + switch (sig) { + __HANDLE(INT) + __HANDLE(ILL) + __HANDLE(QUIT) + __HANDLE(USR1) + __HANDLE(USR2) default: LOG_WARN("SIGNAL", "Not handled signal %d", sig); break; } + +#undef __HANDLE } static void @@ -825,17 +835,30 @@ __lkt_handle_INT(struct lkt_state *srv) /* Register default handle for SIGINT, so if you double ctrl+c it exit like * it crashed. */ - LOG_INFO("SIGNAL", "Now use default handler for SIGINT"); - signal(SIGINT, SIG_DFL); + LOG_INFO("SIGNAL", "Now use default handler for SIGINT and SIGQUIT"); + signal(SIGINT, SIG_DFL); + signal(SIGQUIT, SIG_DFL); exit(EXIT_SUCCESS); } +static void +__lkt_handle_ILL(struct lkt_state UNUSED *srv) +{ + LOG_ERROR("SIGNAL", "Handle the SIGILL, I will try to exit normally"); + __lkt_handle_INT(srv); +} + static void __lkt_handle_USR1(struct lkt_state UNUSED *srv) { } +static void +__lkt_handle_USR2(struct lkt_state UNUSED *srv) +{ +} + static inline void handle_signals(struct lkt_state *srv) { @@ -846,10 +869,15 @@ handle_signals(struct lkt_state *srv) srv->__signal_##signal(srv); \ else \ LOG_WARN("SIGNAL", "No signal handler in server for SIG"#signal); \ - } + } \ + __lkt_signal_##signal = 0; + __HANDLE(srv, INT) + __HANDLE(srv, ILL) + __HANDLE(srv, QUIT) __HANDLE(srv, USR1) __HANDLE(srv, USR2) + #undef __HANDLE } @@ -867,11 +895,15 @@ lkt_listen(struct lkt_state *srv) LOG_INFO("SIGNAL", "Register signal handlers for signals..."); srv->__signal_INT = __lkt_handle_INT; + srv->__signal_QUIT = __lkt_handle_INT; srv->__signal_USR1 = __lkt_handle_USR1; - srv->__signal_USR2 = NULL; + srv->__signal_USR2 = __lkt_handle_USR2; + srv->__signal_ILL = __lkt_handle_ILL; signal(SIGINT, __signal_handler); + signal(SIGILL, __signal_handler); signal(SIGUSR1, __signal_handler); signal(SIGUSR2, __signal_handler); + signal(SIGQUIT, __signal_handler); LOG_INFO("SIGNAL", "Signal handlers registered"); if ((srv->fds[0].fd = init_listening_socket(srv->host, srv->port)) < 0)