From b5afb5b158181fdfff8fba04b6443a47fd97e9fd Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sat, 26 Apr 2014 16:09:12 -0400 Subject: [PATCH] Signal catching to force atexit handling. --- 1pass.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/1pass.c b/1pass.c index 1592bdf..66d04ee 100644 --- a/1pass.c +++ b/1pass.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "lua.h" #include "lauxlib.h" @@ -585,8 +586,46 @@ static int initLua(const int argc, char **argv) } // initLua +static void deinitAll() +{ + deinitPowermate(); + deinitKeyHook(); + deinitLua(); +} // deinitAll + + +static void killerSignalCatcher(int sig) +{ + static int been_run = 0; + if (been_run) + { + fprintf(stderr, "Caught signal %d, terminating HARD.\n", sig); + _exit(0); + } // if + + been_run = 1; + fprintf(stderr, "Caught signal %d, terminating.\n", sig); + exit(0); // trigger atexit handlers. +} // killerSignalCatcher + + +static void initSignals(void) +{ + signal(SIGINT, killerSignalCatcher); + signal(SIGQUIT, killerSignalCatcher); + signal(SIGILL, killerSignalCatcher); + signal(SIGFPE, killerSignalCatcher); + signal(SIGTERM, killerSignalCatcher); + signal(SIGPIPE, killerSignalCatcher); + signal(SIGSEGV, killerSignalCatcher); + signal(SIGABRT, killerSignalCatcher); + signal(SIGHUP, killerSignalCatcher); +} // initSignals + + int main(int argc, char **argv) { + initSignals(); initPowermate(&argc, argv); gtk_init(&argc, &argv);