# HG changeset patch # User Chris Cannam # Date 1586436547 -3600 # Node ID e027aa280789a9235ab79c7ee10d585ed563ac64 # Parent ef64b3f171d947de9b07c4d5715ec7ab89401514 Add signal handler diff -r ef64b3f171d9 -r e027aa280789 src/helper.cpp --- a/src/helper.cpp Tue Jan 07 11:20:32 2020 +0000 +++ b/src/helper.cpp Thu Apr 09 13:49:07 2020 +0100 @@ -92,15 +92,14 @@ #include #include +static std::string currentSoname = ""; + #ifdef _WIN32 #ifndef UNICODE #error "This must be compiled with UNICODE defined" #endif -static std::string lastLibraryName = ""; - static HMODULE loadLibraryUTF8(std::string name) { - lastLibraryName = name; int n = name.size(); int wn = MultiByteToWideChar(CP_UTF8, 0, name.c_str(), n, 0, 0); wchar_t *wname = new wchar_t[wn+1]; @@ -150,8 +149,8 @@ } } std::size_t pos = s.find("%1"); - if (pos != std::string::npos && lastLibraryName != "") { - s.replace(pos, 2, lastLibraryName); + if (pos != std::string::npos && currentSoname != "") { + s.replace(pos, 2, currentSoname); } return s; } @@ -199,8 +198,6 @@ #endif -//#include - using namespace std; string error() @@ -335,6 +332,14 @@ #endif } +static void +signalHandler(int signal) +{ + cerr << "Signal " << signal << " caught" << endl; + cout << "FAILURE|" << currentSoname << "|[" << int(PluginCheckCode::FAIL_NOT_LOADABLE) << "]" << endl; + exit(1); +} + int main(int argc, char **argv) { bool allGood = true; @@ -363,6 +368,18 @@ return 2; } + signal(SIGINT, signalHandler); + signal(SIGTERM, signalHandler); + +#ifndef _WIN32 + signal(SIGHUP, signalHandler); + signal(SIGQUIT, signalHandler); + signal(SIGILL, signalHandler); + signal(SIGABRT, signalHandler); + signal(SIGSEGV, signalHandler); + signal(SIGBUS, signalHandler); +#endif + string descriptor = argv[1]; #ifdef _WIN32 @@ -379,6 +396,9 @@ suspendOutput(); while (getline(cin, soname)) { + + currentSoname = soname; + Result result = check(soname, descriptor); resumeOutput(); if (result.code == PluginCheckCode::SUCCESS) {