|
|
@ -79,10 +79,15 @@ Q_IMPORT_PLUGIN(qico) |
|
|
|
|
|
|
|
|
|
|
|
// Signal handlers
|
|
|
|
// Signal handlers
|
|
|
|
#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) |
|
|
|
#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) |
|
|
|
void sigintHandler(int); |
|
|
|
void sigNormalHandler(int signum); |
|
|
|
void sigtermHandler(int); |
|
|
|
void sigAbnormalHandler(int signum); |
|
|
|
void sigsegvHandler(int); |
|
|
|
// sys_signame[] is only defined in BSD
|
|
|
|
void sigabrtHandler(int); |
|
|
|
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 |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
struct QBtCommandLineParameters |
|
|
|
struct QBtCommandLineParameters |
|
|
@ -240,10 +245,10 @@ int main(int argc, char *argv[]) |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) |
|
|
|
#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) |
|
|
|
signal(SIGABRT, sigabrtHandler); |
|
|
|
signal(SIGINT, sigNormalHandler); |
|
|
|
signal(SIGTERM, sigtermHandler); |
|
|
|
signal(SIGTERM, sigNormalHandler); |
|
|
|
signal(SIGINT, sigintHandler); |
|
|
|
signal(SIGABRT, sigAbnormalHandler); |
|
|
|
signal(SIGSEGV, sigsegvHandler); |
|
|
|
signal(SIGSEGV, sigAbnormalHandler); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
return app->exec(params.torrents); |
|
|
|
return app->exec(params.torrents); |
|
|
@ -303,58 +308,41 @@ QBtCommandLineParameters parseCommandLine() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) |
|
|
|
#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 |
|
|
|
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU |
|
|
|
std::cerr << "\n\n*************************************************************\n"; |
|
|
|
const char str1[] = "Catching signal: "; |
|
|
|
std::cerr << "Catching SIGSEGV, please report a bug at http://bug.qbittorrent.org\nand provide the following backtrace:\n"; |
|
|
|
const char *sigName = sysSigName[signum]; |
|
|
|
std::cerr << "qBittorrent version: " << VERSION << std::endl; |
|
|
|
const char str2[] = "\nExiting cleanly\n"; |
|
|
|
print_stacktrace(); |
|
|
|
write(STDERR_FILENO, str1, strlen(str1)); |
|
|
|
#else |
|
|
|
write(STDERR_FILENO, sigName, strlen(sigName)); |
|
|
|
#ifdef STACKTRACE_WIN |
|
|
|
write(STDERR_FILENO, str2, strlen(str2)); |
|
|
|
StraceDlg dlg; |
|
|
|
#endif // !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
|
|
|
dlg.setStacktraceString(straceWin::getBacktrace()); |
|
|
|
signal(signum, SIG_DFL); |
|
|
|
dlg.exec(); |
|
|
|
qApp->exit(); // unsafe, but exit anyway
|
|
|
|
#endif |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
raise(SIGSEGV); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void sigabrtHandler(int) |
|
|
|
void sigAbnormalHandler(int signum) |
|
|
|
{ |
|
|
|
{ |
|
|
|
signal(SIGABRT, 0); |
|
|
|
|
|
|
|
signal(SIGSEGV, 0); |
|
|
|
|
|
|
|
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU |
|
|
|
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU |
|
|
|
std::cerr << "\n\n*************************************************************\n"; |
|
|
|
const char str1[] = "\n\n*************************************************************\nCatching signal: "; |
|
|
|
std::cerr << "Catching SIGABRT, please report a bug at http://bug.qbittorrent.org\nand provide the following backtrace:\n"; |
|
|
|
const char *sigName = sysSigName[signum]; |
|
|
|
std::cerr << "qBittorrent version: " << VERSION << std::endl; |
|
|
|
const char str2[] = "\nPlease file a bug report at http://bug.qbittorrent.org and provide the following information:\n\n" |
|
|
|
print_stacktrace(); |
|
|
|
"qBittorrent version: " VERSION "\n"; |
|
|
|
#else |
|
|
|
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 |
|
|
|
#ifdef STACKTRACE_WIN |
|
|
|
StraceDlg dlg; |
|
|
|
StraceDlg dlg; // unsafe
|
|
|
|
dlg.setStacktraceString(straceWin::getBacktrace()); |
|
|
|
dlg.setStacktraceString(straceWin::getBacktrace()); |
|
|
|
dlg.exec(); |
|
|
|
dlg.exec(); |
|
|
|
#endif |
|
|
|
#endif // STACKTRACE_WIN
|
|
|
|
#endif |
|
|
|
signal(signum, SIG_DFL); |
|
|
|
raise(SIGABRT); |
|
|
|
raise(signum); |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif // defined(Q_OS_UNIX) || defined(STACKTRACE_WIN)
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef DISABLE_GUI |
|
|
|
#ifndef DISABLE_GUI |
|
|
|
void showSplashScreen() |
|
|
|
void showSplashScreen() |
|
|
|