From 5c8a4b3912556076ffaedcd00608c23dd6ece654 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Sun, 13 Dec 2015 18:14:12 +0800 Subject: [PATCH] Simplify signal handler Try to use signal-safe functions as much as possible Closes #3995 Define sys_signame[] ourselves on linux --- src/app/main.cpp | 88 +++++++++++++++++++++--------------------------- 1 file changed, 38 insertions(+), 50 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index 94e16bcc7..83b3ab89f 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -79,10 +79,15 @@ Q_IMPORT_PLUGIN(qico) // Signal handlers #if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) -void sigintHandler(int); -void sigtermHandler(int); -void sigsegvHandler(int); -void sigabrtHandler(int); +void sigNormalHandler(int signum); +void sigAbnormalHandler(int signum); +// sys_signame[] is only defined in BSD +const char *sysSigName[] = { + "", "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP", "SIGABRT", "SIGBUS", "SIGFPE", "SIGKILL", + "SIGUSR1", "SIGSEGV", "SIGUSR2", "SIGPIPE", "SIGALRM", "SIGTERM", "SIGSTKFLT", "SIGCHLD", "SIGCONT", "SIGSTOP", + "SIGTSTP", "SIGTTIN", "SIGTTOU", "SIGURG", "SIGXCPU", "SIGXFSZ", "SIGVTALRM", "SIGPROF", "SIGWINCH", "SIGIO", + "SIGPWR", "SIGUNUSED" +}; #endif struct QBtCommandLineParameters @@ -240,10 +245,10 @@ int main(int argc, char *argv[]) #endif #if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) - signal(SIGABRT, sigabrtHandler); - signal(SIGTERM, sigtermHandler); - signal(SIGINT, sigintHandler); - signal(SIGSEGV, sigsegvHandler); + signal(SIGINT, sigNormalHandler); + signal(SIGTERM, sigNormalHandler); + signal(SIGABRT, sigAbnormalHandler); + signal(SIGSEGV, sigAbnormalHandler); #endif return app->exec(params.torrents); @@ -303,58 +308,41 @@ QBtCommandLineParameters parseCommandLine() } #if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) -void sigintHandler(int) +void sigNormalHandler(int signum) { - signal(SIGINT, 0); - qDebug("Catching SIGINT, exiting cleanly"); - qApp->exit(); -} - -void sigtermHandler(int) -{ - signal(SIGTERM, 0); - qDebug("Catching SIGTERM, exiting cleanly"); - qApp->exit(); -} - -void sigsegvHandler(int) -{ - signal(SIGABRT, 0); - signal(SIGSEGV, 0); #if !defined Q_OS_WIN && !defined Q_OS_HAIKU - std::cerr << "\n\n*************************************************************\n"; - std::cerr << "Catching SIGSEGV, please report a bug at http://bug.qbittorrent.org\nand provide the following backtrace:\n"; - std::cerr << "qBittorrent version: " << VERSION << std::endl; - print_stacktrace(); -#else -#ifdef STACKTRACE_WIN - StraceDlg dlg; - dlg.setStacktraceString(straceWin::getBacktrace()); - dlg.exec(); -#endif -#endif - raise(SIGSEGV); + const char str1[] = "Catching signal: "; + const char *sigName = sysSigName[signum]; + const char str2[] = "\nExiting cleanly\n"; + write(STDERR_FILENO, str1, strlen(str1)); + write(STDERR_FILENO, sigName, strlen(sigName)); + write(STDERR_FILENO, str2, strlen(str2)); +#endif // !defined Q_OS_WIN && !defined Q_OS_HAIKU + signal(signum, SIG_DFL); + qApp->exit(); // unsafe, but exit anyway } -void sigabrtHandler(int) +void sigAbnormalHandler(int signum) { - signal(SIGABRT, 0); - signal(SIGSEGV, 0); #if !defined Q_OS_WIN && !defined Q_OS_HAIKU - std::cerr << "\n\n*************************************************************\n"; - std::cerr << "Catching SIGABRT, please report a bug at http://bug.qbittorrent.org\nand provide the following backtrace:\n"; - std::cerr << "qBittorrent version: " << VERSION << std::endl; - print_stacktrace(); -#else + const char str1[] = "\n\n*************************************************************\nCatching signal: "; + const char *sigName = sysSigName[signum]; + const char str2[] = "\nPlease file a bug report at http://bug.qbittorrent.org and provide the following information:\n\n" + "qBittorrent version: " VERSION "\n"; + write(STDERR_FILENO, str1, strlen(str1)); + write(STDERR_FILENO, sigName, strlen(sigName)); + write(STDERR_FILENO, str2, strlen(str2)); + print_stacktrace(); // unsafe +#endif // !defined Q_OS_WIN && !defined Q_OS_HAIKU #ifdef STACKTRACE_WIN - StraceDlg dlg; + StraceDlg dlg; // unsafe dlg.setStacktraceString(straceWin::getBacktrace()); dlg.exec(); -#endif -#endif - raise(SIGABRT); +#endif // STACKTRACE_WIN + signal(signum, SIG_DFL); + raise(signum); } -#endif +#endif // defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) #ifndef DISABLE_GUI void showSplashScreen()