3 #include <QSocketNotifier>
4 #include <QCoreApplication>
12 #include <sys/types.h>
15 #include <sys/socket.h>
29 static const std::array<
const int, 6
38 SIGINT, SIGTERM, SIGSEGV, SIGABRT, SIGFPE, SIGILL,
50 std::array<std::string,SIG_STR_COUNT>
sig_str;
57 sig_str[sig] = qPrintable(QString(
"Handling %1\n").arg(name));
62 for (
size_t i = 0; i <
sig_str.size(); i++)
63 sig_str_init(i, qPrintable(QString(
"Signal %1").arg(i)));
77 stack.ss_size = SIGSTKSZ;
80 if (sigaltstack(&stack,
nullptr) == -1)
82 std::cerr <<
"Couldn't create signal stack!" << std::endl;
87 if (::socketpair(AF_UNIX, SOCK_STREAM, 0,
s_sigFd.data()))
89 std::cerr <<
"Couldn't create socketpair" << std::endl;
119 int signum = it.key();
120 signal(signum, SIG_DFL);
152 const char *signame = strsignal(signum);
153 QString signal_name = signame ?
154 QString(signame) : QString(
"Unknown(%1)").arg(signum);
156 bool sa_handler_already_set =
false;
159 sa_handler_already_set =
m_sigMap.contains(signum);
160 if (
m_sigMap.value(signum,
nullptr) && (handler !=
nullptr))
162 LOG(VB_GENERAL, LOG_WARNING,
163 QString(
"Warning %1 signal handler overridden")
169 if (!sa_handler_already_set)
171 struct sigaction sa {};
173 sigemptyset(&sa.sa_mask);
174 sa.sa_flags = SA_RESTART | SA_SIGINFO;
176 sa.sa_flags |= SA_ONSTACK;
180 sigaction(signum, &sa,
nullptr);
183 LOG(VB_GENERAL, LOG_INFO, QString(
"Setup %1 handler").arg(signal_name));
197 [[maybe_unused]]
void *context)
203 signalInfo.m_code = 0;
204 signalInfo.m_pid = 0;
205 signalInfo.m_uid = 0;
206 signalInfo.m_value = 0;
208 signalInfo.m_code = (info ? info->si_code : 0);
209 signalInfo.m_pid = (info ? (int)info->si_pid : 0);
210 signalInfo.m_uid = (info ? (int)info->si_uid : 0);
211 signalInfo.m_value = (info ? info->si_value.sival_int : 0);
217 char *buffer = (
char *)&signalInfo;
247 signal(signum, SIG_DFL);
261 if (signum <
static_cast<int>(
sig_str.size()))
272 signal(signum, SIG_DFL);
284 bool infoComplete = (ret ==
sizeof(
SignalInfo));
285 int signum = (infoComplete ? signalInfo.m_signum : 0);
289 QString signame = strsignal(signum);
290 if (signame.isEmpty())
291 signame =
"Unknown Signal";
292 LOG(VB_GENERAL, LOG_CRIT,
293 QString(
"Received %1: Code %2, PID %3, UID %4, Value 0x%5")
294 .arg(signame) .arg(signalInfo.m_code) .arg(signalInfo.m_pid)
295 .arg(signalInfo.m_uid) .arg(signalInfo.m_value,8,16,QChar(
'0')));
299 bool allowNullHandler =
false;
302 if (signum == SIGRTMIN)
307 allowNullHandler =
true;
309 #endif // Q_OS_DARWIN
316 handler =
m_sigMap.value(signum,
nullptr);
322 QCoreApplication::exit(0);
335 handler =
m_sigMap.value(signum,
nullptr);
341 else if (!allowNullHandler)
343 LOG(VB_GENERAL, LOG_CRIT, QString(
"Received unexpected signal %1")