| 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 | } |