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