master
c 54 lines 1.45 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #include "../libnetdata.h"
4
5 void signals_block_all(void) {
6 sigset_t sigset;
7 sigfillset(&sigset);
8
9 if(pthread_sigmask(SIG_BLOCK, &sigset, NULL) != 0)
10 nd_log(NDLS_DAEMON, NDLP_ERR,
11 "SIGNALS: cannot apply the default mask for signals");
12 }
13
14 void signals_unblock_one(int signo) {
15 sigset_t sigset;
16 sigemptyset(&sigset); // Initialize the signal set to empty
17 sigaddset(&sigset, signo); // Add our signal to the set
18
19 if(pthread_sigmask(SIG_UNBLOCK, &sigset, NULL) != 0)
20 nd_log(NDLS_COLLECTORS, NDLP_ERR,
21 "SIGNALS: cannot unmask signal %d", signo);
22 }
23
24 void signals_unblock(int signals[], size_t count) {
25 sigset_t sigset;
26 sigemptyset(&sigset); // Initialize the signal set to empty
27
28 // Add each signal from the array to the signal set
29 for (size_t i = 0; i < count; i++)
30 sigaddset(&sigset, signals[i]);
31
32 // Unblock all signals in the set
33 if (pthread_sigmask(SIG_UNBLOCK, &sigset, NULL) != 0)
34 nd_log(NDLS_COLLECTORS, NDLP_ERR, "SIGNALS: cannot unmask signals");
35 }
36
37 void signals_unblock_deadly(void) {
38 int deadly_signals[] = {
39 SIGBUS,
40 SIGSEGV,
41 SIGFPE,
42 SIGILL,
43 SIGABRT,
44 SIGSYS,
45 SIGXCPU,
46 SIGXFSZ,
47 };
48 signals_unblock(deadly_signals, _countof(deadly_signals));
49 }
50
51 void signals_block_all_except_deadly(void) {
52 signals_block_all();
53 signals_unblock_deadly();
54 }