#ifdef WIN32
# ifndef WIN32_LEAN_AND_MEAN
# define WIN32_LEAN_AND_MEAN
# endif
# include <windows.h>
#endif
#include "config.h"
#include <stdio.h>
#include <stdbool.h>
#include <signal.h>
#ifdef WITH_PERSISTENCE
extern bool flag_db_backup;
#endif
extern bool flag_reload;
extern bool flag_tree_print;
extern int run;
#ifdef SIGHUP
void handle_sighup(int signal)
{
UNUSED(signal);
flag_reload = true;
}
#endif
void handle_sigint(int signal)
{
UNUSED(signal);
run = 0;
}
void handle_sigusr1(int signal)
{
UNUSED(signal);
#ifdef WITH_PERSISTENCE
flag_db_backup = true;
#endif
}
void handle_sigusr2(int signal)
{
UNUSED(signal);
flag_tree_print = true;
}
#ifdef WIN32
DWORD WINAPI SigThreadProc(void* data)
{
TCHAR evt_name[MAX_PATH];
static HANDLE evt[3];
int pid = GetCurrentProcessId();
sprintf_s(evt_name, MAX_PATH, "mosq%d_shutdown", pid);
evt[0] = CreateEvent(NULL, TRUE, FALSE, evt_name);
sprintf_s(evt_name, MAX_PATH, "mosq%d_reload", pid);
evt[1] = CreateEvent(NULL, FALSE, FALSE, evt_name);
sprintf_s(evt_name, MAX_PATH, "mosq%d_backup", pid);
evt[2] = CreateEvent(NULL, FALSE, FALSE, evt_name);
while (true) {
int wr = WaitForMultipleObjects(sizeof(evt) / sizeof(HANDLE), evt, FALSE, INFINITE);
switch (wr) {
case WAIT_OBJECT_0 + 0:
handle_sigint(SIGINT);
break;
case WAIT_OBJECT_0 + 1:
flag_reload = true;
continue;
case WAIT_OBJECT_0 + 2:
handle_sigusr1(0);
continue;
break;
}
}
CloseHandle(evt[0]);
CloseHandle(evt[1]);
CloseHandle(evt[2]);
return 0;
}
#endif