StringList LIBNETXMS_EXPORTABLE *ParseCommandLine(const TCHAR *cmdline);
#if !defined(_WIN32) && !defined(_NETWARE) && defined(NMS_THREADS_H_INCLUDED)
+void LIBNETXMS_EXPORTABLE BlockAllSignals(bool processWide);
void LIBNETXMS_EXPORTABLE StartMainLoop(ThreadFunction pfSignalHandler, ThreadFunction pfMain);
#endif
static THREAD_RESULT THREAD_CALL SignalHandler(void *pArg)
{
sigset_t signals;
- int nSignal;
-
sigemptyset(&signals);
sigaddset(&signals, SIGTERM);
sigaddset(&signals, SIGINT);
sigaddset(&signals, SIGPIPE);
#endif
- sigprocmask(SIG_BLOCK, &signals, NULL);
-
- while(1)
+ while(true)
{
+ int nSignal;
if (sigwait(&signals, &nSignal) == 0)
{
switch(nSignal)
InitNetXMSProcess();
-#if defined(__sun) || defined(_AIX) || defined(__hpux)
- signal(SIGPIPE, SIG_IGN);
- signal(SIGHUP, SIG_IGN);
- signal(SIGQUIT, SIG_IGN);
- signal(SIGUSR1, SIG_IGN);
- signal(SIGUSR2, SIG_IGN);
-#endif
-
// Check for alternate config file location
#ifdef _WIN32
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\NetXMS\\Agent"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
#endif
/**
- * Start main loop and signal handler for daemon
+ * Block all signals on a thread
*/
-void LIBNETXMS_EXPORTABLE StartMainLoop(ThreadFunction pfSignalHandler, ThreadFunction pfMain)
+void LIBNETXMS_EXPORTABLE BlockAllSignals(bool processWide)
{
- THREAD hThread;
- struct utsname un;
- int nModel = 0;
sigset_t signals;
-
- // Block signals
sigemptyset(&signals);
sigaddset(&signals, SIGTERM);
sigaddset(&signals, SIGINT);
- sigaddset(&signals, SIGPIPE);
sigaddset(&signals, SIGSEGV);
sigaddset(&signals, SIGCHLD);
sigaddset(&signals, SIGHUP);
sigaddset(&signals, SIGUSR1);
sigaddset(&signals, SIGUSR2);
- sigprocmask(SIG_BLOCK, &signals, NULL);
+#if !defined(__sun) && !defined(_AIX) && !defined(__hpux)
+ sigaddset(&signals, SIGPIPE);
+#endif
+ if (processWide)
+ sigprocmask(SIG_BLOCK, &signals, NULL);
+ else
+ pthread_sigmask(SIG_BLOCK, &signals, NULL);
+}
+
+/**
+ * Start main loop and signal handler for daemon
+ */
+void LIBNETXMS_EXPORTABLE StartMainLoop(ThreadFunction pfSignalHandler, ThreadFunction pfMain)
+{
+ THREAD hThread;
+ struct utsname un;
+ int nModel = 0;
if (uname(&un) != -1)
{
#ifdef _WIN32
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
#endif
+
+#if defined(__sun) || defined(_AIX) || defined(__hpux)
+ signal(SIGPIPE, SIG_IGN);
+ signal(SIGHUP, SIG_IGN);
+ signal(SIGQUIT, SIG_IGN);
+ signal(SIGUSR1, SIG_IGN);
+ signal(SIGUSR2, SIG_IGN);
+#endif
+
+ BlockAllSignals(true);
}
/**
#include <dbghelp.h>
#endif
-#ifndef _WIN32
-#include <signal.h>
-#endif
-
#if defined(_WITH_ENCRYPTION) && defined(_WIN32)
#include <openssl/applink.c>
#endif
{
InitNetXMSProcess();
-#ifndef _WIN32
- signal(SIGPIPE, SIG_IGN);
- signal(SIGHUP, SIG_IGN);
- signal(SIGQUIT, SIG_IGN);
- signal(SIGUSR1, SIG_IGN);
- signal(SIGUSR2, SIG_IGN);
-#endif
-
// Check for alternate config file location
#ifdef _WIN32
HKEY hKey;