xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Console/ConsoleClose.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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 Worker static 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 Worker CCtrlHandlerSetter::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 Worker CCtrlHandlerSetter::~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 Worker static 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 Worker CCtrlHandlerSetter::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 Worker CCtrlHandlerSetter::~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