1*f6dc9357SAndroid Build Coastguard Worker // ConsoleClose.cpp 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h" 4*f6dc9357SAndroid Build Coastguard Worker 5*f6dc9357SAndroid Build Coastguard Worker #include "ConsoleClose.h" 6*f6dc9357SAndroid Build Coastguard Worker 7*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE 8*f6dc9357SAndroid Build Coastguard Worker 9*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyWindows.h" 11*f6dc9357SAndroid Build Coastguard Worker #else 12*f6dc9357SAndroid Build Coastguard Worker #include <stdlib.h> 13*f6dc9357SAndroid Build Coastguard Worker #include <signal.h> 14*f6dc9357SAndroid Build Coastguard Worker #endif 15*f6dc9357SAndroid Build Coastguard Worker 16*f6dc9357SAndroid Build Coastguard Worker namespace NConsoleClose { 17*f6dc9357SAndroid Build Coastguard Worker 18*f6dc9357SAndroid Build Coastguard Worker unsigned g_BreakCounter = 0; 19*f6dc9357SAndroid Build Coastguard Worker static const unsigned kBreakAbortThreshold = 3; 20*f6dc9357SAndroid Build Coastguard Worker 21*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 22*f6dc9357SAndroid Build Coastguard Worker HandlerRoutine(DWORD ctrlType)23*f6dc9357SAndroid Build Coastguard Workerstatic BOOL WINAPI HandlerRoutine(DWORD ctrlType) 24*f6dc9357SAndroid Build Coastguard Worker { 25*f6dc9357SAndroid Build Coastguard Worker if (ctrlType == CTRL_LOGOFF_EVENT) 26*f6dc9357SAndroid Build Coastguard Worker { 27*f6dc9357SAndroid Build Coastguard Worker // printf("\nCTRL_LOGOFF_EVENT\n"); 28*f6dc9357SAndroid Build Coastguard Worker return TRUE; 29*f6dc9357SAndroid Build Coastguard Worker } 30*f6dc9357SAndroid Build Coastguard Worker 31*f6dc9357SAndroid Build Coastguard Worker if (++g_BreakCounter < kBreakAbortThreshold) 32*f6dc9357SAndroid Build Coastguard Worker return TRUE; 33*f6dc9357SAndroid Build Coastguard Worker return FALSE; 34*f6dc9357SAndroid Build Coastguard Worker /* 35*f6dc9357SAndroid Build Coastguard Worker switch (ctrlType) 36*f6dc9357SAndroid Build Coastguard Worker { 37*f6dc9357SAndroid Build Coastguard Worker case CTRL_C_EVENT: 38*f6dc9357SAndroid Build Coastguard Worker case CTRL_BREAK_EVENT: 39*f6dc9357SAndroid Build Coastguard Worker if (g_BreakCounter < kBreakAbortThreshold) 40*f6dc9357SAndroid Build Coastguard Worker return TRUE; 41*f6dc9357SAndroid Build Coastguard Worker } 42*f6dc9357SAndroid Build Coastguard Worker return FALSE; 43*f6dc9357SAndroid Build Coastguard Worker */ 44*f6dc9357SAndroid Build Coastguard Worker } 45*f6dc9357SAndroid Build Coastguard Worker CCtrlHandlerSetter()46*f6dc9357SAndroid Build Coastguard WorkerCCtrlHandlerSetter::CCtrlHandlerSetter() 47*f6dc9357SAndroid Build Coastguard Worker { 48*f6dc9357SAndroid Build Coastguard Worker if (!SetConsoleCtrlHandler(HandlerRoutine, TRUE)) 49*f6dc9357SAndroid Build Coastguard Worker throw 1019; // "SetConsoleCtrlHandler fails"; 50*f6dc9357SAndroid Build Coastguard Worker } 51*f6dc9357SAndroid Build Coastguard Worker ~CCtrlHandlerSetter()52*f6dc9357SAndroid Build Coastguard WorkerCCtrlHandlerSetter::~CCtrlHandlerSetter() 53*f6dc9357SAndroid Build Coastguard Worker { 54*f6dc9357SAndroid Build Coastguard Worker if (!SetConsoleCtrlHandler(HandlerRoutine, FALSE)) 55*f6dc9357SAndroid Build Coastguard Worker { 56*f6dc9357SAndroid Build Coastguard Worker // warning for throw in destructor. 57*f6dc9357SAndroid Build Coastguard Worker // throw "SetConsoleCtrlHandler fails"; 58*f6dc9357SAndroid Build Coastguard Worker } 59*f6dc9357SAndroid Build Coastguard Worker } 60*f6dc9357SAndroid Build Coastguard Worker 61*f6dc9357SAndroid Build Coastguard Worker #else // _WIN32 62*f6dc9357SAndroid Build Coastguard Worker HandlerRoutine(int)63*f6dc9357SAndroid Build Coastguard Workerstatic void HandlerRoutine(int) 64*f6dc9357SAndroid Build Coastguard Worker { 65*f6dc9357SAndroid Build Coastguard Worker if (++g_BreakCounter < kBreakAbortThreshold) 66*f6dc9357SAndroid Build Coastguard Worker return; 67*f6dc9357SAndroid Build Coastguard Worker exit(EXIT_FAILURE); 68*f6dc9357SAndroid Build Coastguard Worker } 69*f6dc9357SAndroid Build Coastguard Worker CCtrlHandlerSetter()70*f6dc9357SAndroid Build Coastguard WorkerCCtrlHandlerSetter::CCtrlHandlerSetter() 71*f6dc9357SAndroid Build Coastguard Worker { 72*f6dc9357SAndroid Build Coastguard Worker memo_sig_int = signal(SIGINT, HandlerRoutine); // CTRL-C 73*f6dc9357SAndroid Build Coastguard Worker if (memo_sig_int == SIG_ERR) 74*f6dc9357SAndroid Build Coastguard Worker throw "SetConsoleCtrlHandler fails (SIGINT)"; 75*f6dc9357SAndroid Build Coastguard Worker memo_sig_term = signal(SIGTERM, HandlerRoutine); // for kill -15 (before "kill -9") 76*f6dc9357SAndroid Build Coastguard Worker if (memo_sig_term == SIG_ERR) 77*f6dc9357SAndroid Build Coastguard Worker throw "SetConsoleCtrlHandler fails (SIGTERM)"; 78*f6dc9357SAndroid Build Coastguard Worker } 79*f6dc9357SAndroid Build Coastguard Worker ~CCtrlHandlerSetter()80*f6dc9357SAndroid Build Coastguard WorkerCCtrlHandlerSetter::~CCtrlHandlerSetter() 81*f6dc9357SAndroid Build Coastguard Worker { 82*f6dc9357SAndroid Build Coastguard Worker signal(SIGINT, memo_sig_int); // CTRL-C 83*f6dc9357SAndroid Build Coastguard Worker signal(SIGTERM, memo_sig_term); // kill {pid} 84*f6dc9357SAndroid Build Coastguard Worker } 85*f6dc9357SAndroid Build Coastguard Worker 86*f6dc9357SAndroid Build Coastguard Worker #endif // _WIN32 87*f6dc9357SAndroid Build Coastguard Worker 88*f6dc9357SAndroid Build Coastguard Worker /* 89*f6dc9357SAndroid Build Coastguard Worker void CheckCtrlBreak() 90*f6dc9357SAndroid Build Coastguard Worker { 91*f6dc9357SAndroid Build Coastguard Worker if (TestBreakSignal()) 92*f6dc9357SAndroid Build Coastguard Worker throw CCtrlBreakException(); 93*f6dc9357SAndroid Build Coastguard Worker } 94*f6dc9357SAndroid Build Coastguard Worker */ 95*f6dc9357SAndroid Build Coastguard Worker 96*f6dc9357SAndroid Build Coastguard Worker } 97*f6dc9357SAndroid Build Coastguard Worker 98*f6dc9357SAndroid Build Coastguard Worker #endif 99