20#include <freerdp/config.h>
25#include <winpr/debug.h>
27#include <freerdp/utils/signal.h>
28#include <freerdp/log.h>
30#include "platform_signal.h"
32#define TAG FREERDP_TAG("utils.signal")
35const char* strsignal(
int signum);
38BOOL fsig_handlers_registered = FALSE;
43 freerdp_signal_handler_t handler;
46static size_t cleanup_handler_count = 0;
47static cleanup_handler_t cleanup_handlers[20] = WINPR_C_ARRAY_INIT;
49void fsig_term_handler(
int signum)
51 static BOOL recursive = FALSE;
57 WLog_ERR(TAG,
"Caught signal '%s' [%d]", strsignal(signum), signum);
61 for (
size_t x = 0; x < cleanup_handler_count; x++)
63 const cleanup_handler_t empty = WINPR_C_ARRAY_INIT;
64 cleanup_handler_t* cur = &cleanup_handlers[x];
68 cur->handler(signum, strsignal(signum), cur->context);
72 cleanup_handler_count = 0;
76BOOL freerdp_add_signal_cleanup_handler(
void* context, freerdp_signal_handler_t handler)
80 if (fsig_handlers_registered)
82 if (cleanup_handler_count < ARRAYSIZE(cleanup_handlers))
84 cleanup_handler_t* cur = &cleanup_handlers[cleanup_handler_count++];
85 cur->context = context;
86 cur->handler = handler;
89 WLog_WARN(TAG,
"Failed to register cleanup handler, only %" PRIuz
" handlers supported",
90 ARRAYSIZE(cleanup_handlers));
97BOOL freerdp_del_signal_cleanup_handler(
void* context, freerdp_signal_handler_t handler)
101 if (fsig_handlers_registered)
103 for (
size_t x = 0; x < cleanup_handler_count; x++)
105 cleanup_handler_t* cur = &cleanup_handlers[x];
106 if ((cur->context == context) && (cur->handler == handler))
108 const cleanup_handler_t empty = WINPR_C_ARRAY_INIT;
109 for (
size_t y = x + 1; y < cleanup_handler_count - 1; y++)
111 *cur++ = cleanup_handlers[y];
115 cleanup_handler_count--;