From: Michael Stapelberg Date: Thu, 27 Sep 2012 10:34:09 +0000 (+0200) Subject: Revert "Use ev_signal to avoid async-unsafe functions (Thanks Markus)" X-Git-Tag: 4.4~106 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=9c01bdeef7c9ae217e5710639efe4fa02781d9ee;p=i3%2Fi3 Revert "Use ev_signal to avoid async-unsafe functions (Thanks Markus)" This makes our signal handler useless and leads to infinite SIGSEGV loops because the ev callback handler gets called only from within the event loop, and control doesn’t necessary get to the event loop… This reverts commit 514265b529ac78b7778eeee2db3dddb6f3a1c24c. --- diff --git a/src/main.c b/src/main.c index 65db1711..95498e34 100644 --- a/src/main.c +++ b/src/main.c @@ -232,15 +232,13 @@ static void i3_exit(void) { * Unlinks the SHM log and re-raises the signal. * */ -static void handle_signal(struct ev_loop *loop, ev_signal *w, int revents) { - int sig = w->signum; +static void handle_signal(int sig, siginfo_t *info, void *data) { fprintf(stderr, "Received signal %d, terminating\n", sig); if (*shmlogname != '\0') { fprintf(stderr, "Closing SHM log \"%s\"\n", shmlogname); shm_unlink(shmlogname); } fflush(stderr); - ev_signal_stop(loop, w); raise(sig); } @@ -783,32 +781,31 @@ int main(int argc, char *argv[]) { } xcb_ungrab_server(conn); + struct sigaction action; -#define HANDLE_SIGNAL_EV(signum) \ - do { \ - struct ev_signal *signal_watcher = scalloc(sizeof(struct ev_signal)); \ - ev_signal_init(signal_watcher, handle_signal, signum); \ - ev_signal_start(main_loop, signal_watcher); \ - } while (0) + action.sa_sigaction = handle_signal; + action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO; + sigemptyset(&action.sa_mask); if (!disable_signalhandler) setup_signal_handler(); else { /* Catch all signals with default action "Core", see signal(7) */ - HANDLE_SIGNAL_EV(SIGQUIT); - HANDLE_SIGNAL_EV(SIGILL); - HANDLE_SIGNAL_EV(SIGABRT); - HANDLE_SIGNAL_EV(SIGFPE); - HANDLE_SIGNAL_EV(SIGSEGV); + if (sigaction(SIGQUIT, &action, NULL) == -1 || + sigaction(SIGILL, &action, NULL) == -1 || + sigaction(SIGABRT, &action, NULL) == -1 || + sigaction(SIGFPE, &action, NULL) == -1 || + sigaction(SIGSEGV, &action, NULL) == -1) + ELOG("Could not setup signal handler"); } /* Catch all signals with default action "Term", see signal(7) */ - HANDLE_SIGNAL_EV(SIGHUP); - HANDLE_SIGNAL_EV(SIGINT); - HANDLE_SIGNAL_EV(SIGALRM); - HANDLE_SIGNAL_EV(SIGTERM); - HANDLE_SIGNAL_EV(SIGUSR1); - HANDLE_SIGNAL_EV(SIGUSR2); + if (sigaction(SIGHUP, &action, NULL) == -1 || + sigaction(SIGINT, &action, NULL) == -1 || + sigaction(SIGALRM, &action, NULL) == -1 || + sigaction(SIGUSR1, &action, NULL) == -1 || + sigaction(SIGUSR2, &action, NULL) == -1) + ELOG("Could not setup signal handler"); /* Ignore SIGPIPE to survive errors when an IPC client disconnects * while we are sending him a message */