From 79fd6782fbf1f3e35beeaa11375b31aad2a6975e Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Wed, 19 Dec 2012 11:42:00 +0400 Subject: [PATCH] handle Ctrl-C from win32 console --- spectrum/src/main.cpp | 23 ++++++++++++++++------- spectrum/src/win32/ServiceWrapper.cpp | 2 +- spectrum/src/win32/ServiceWrapper.h | 2 +- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index 21f6a1c4..68389e80 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -47,12 +47,6 @@ Component *component_ = NULL; UserManager *userManager_ = NULL; Config *config_ = NULL; -void stop() { - userManager_->removeAllUsers(false); - component_->stop(); - eventLoop_->stop(); -} - static void stop_spectrum() { userManager_->removeAllUsers(false); component_->stop(); @@ -67,6 +61,16 @@ static void spectrum_sigterm_handler(int sig) { eventLoop_->postEvent(&stop_spectrum); } +#ifdef WIN32 +BOOL spectrum_control_handler( DWORD fdwCtrlType ) { + if (fdwCtrlType == CTRL_C_EVENT || fdwCtrlType == CTRL_CLOSE_EVENT) { + eventLoop_->postEvent(&stop_spectrum); + return TRUE; + } + return FALSE; +} +#endif + static void removeOldIcons(std::string iconDir) { std::vector dirs; dirs.push_back(iconDir); @@ -126,7 +130,6 @@ static void daemonize(const char *cwd, const char *lock_file) { exit(1); } } - #endif int mainloop() { @@ -291,6 +294,12 @@ int main(int argc, char **argv) std::cout << "SIGTERM handler can't be set\n"; return -1; } +#else + if( !SetConsoleCtrlHandler( (PHANDLER_ROUTINE) spectrum_control_handler, TRUE ) ) + { + std::cout << "control handler can't be set\n"; + return -1; + } #endif boost::program_options::options_description desc(std::string("Spectrum version: ") + SPECTRUM_VERSION + "\nUsage: spectrum [OPTIONS] \nAllowed options"); desc.add_options() diff --git a/spectrum/src/win32/ServiceWrapper.cpp b/spectrum/src/win32/ServiceWrapper.cpp index ad8c6a1a..fc5df08b 100644 --- a/spectrum/src/win32/ServiceWrapper.cpp +++ b/spectrum/src/win32/ServiceWrapper.cpp @@ -87,7 +87,7 @@ void WINAPI ServiceControlHandler(DWORD controlCode) { break; } SetServiceStatus(ServiceStatusHandle, &ServiceStatus); - stop(); + spectrum_control_handler(CTRL_CLOSE_EVENT); } void WINAPI ServiceMain(DWORD argc, LPSTR *argv) { diff --git a/spectrum/src/win32/ServiceWrapper.h b/spectrum/src/win32/ServiceWrapper.h index 9ee2fb0d..aa6bce41 100644 --- a/spectrum/src/win32/ServiceWrapper.h +++ b/spectrum/src/win32/ServiceWrapper.h @@ -15,5 +15,5 @@ public: }; int mainloop(); -void stop(); +BOOL spectrum_control_handler( DWORD fdwCtrlType );