6#include <winpr/debug.h>
7#include <winpr/assert.h>
9#include <freerdp/log.h>
10#include <freerdp/utils/signal.h>
12#include "platform_signal.h"
14#define TAG FREERDP_TAG("utils.signal.posix")
20 EnterCriticalSection(&signal_lock);
25 LeaveCriticalSection(&signal_lock);
28const char* strsignal(
int signum)
42 CASE_STR(SIGABRT_COMPAT);
47static void fatal_handler(
int signum)
49 static BOOL recursive = FALSE;
55 WLog_ERR(TAG,
"Caught signal '%s' [%d]", strsignal(signum), signum);
57 winpr_log_backtrace(TAG, WLOG_ERROR, 20);
63static const int term_signals[] = { SIGINT, SIGTERM };
65static const int fatal_signals[] = { SIGABRT, SIGFPE, SIGILL, SIGSEGV };
67static BOOL register_handlers(
const int* signals,
size_t count,
void (*handler)(
int))
69 WINPR_ASSERT(signals || (count == 0));
70 WINPR_ASSERT(handler);
72 for (
size_t x = 0; x < count; x++)
74 (void)signal(signals[x], handler);
80static void unregister_handlers(
const int* signals,
size_t count)
82 WINPR_ASSERT(signals || (count == 0));
84 for (
size_t x = 0; x < count; x++)
86 (void)signal(signals[x], SIG_IGN);
90static void unregister_all_handlers(
void)
92 unregister_handlers(fatal_signals, ARRAYSIZE(fatal_signals));
93 unregister_handlers(term_signals, ARRAYSIZE(term_signals));
94 DeleteCriticalSection(&signal_lock);
97int freerdp_handle_signals(
void)
100 InitializeCriticalSection(&signal_lock);
104 WLog_DBG(TAG,
"Registering signal hook...");
106 (void)atexit(unregister_all_handlers);
107 if (!register_handlers(fatal_signals, ARRAYSIZE(fatal_signals), fatal_handler))
109 if (!register_handlers(term_signals, ARRAYSIZE(term_signals), fsig_term_handler))
112 fsig_handlers_registered =
true;