diff --git a/DGIdGateway/DGIdGateway.cpp b/DGIdGateway/DGIdGateway.cpp index 7897fac..447f76b 100644 --- a/DGIdGateway/DGIdGateway.cpp +++ b/DGIdGateway/DGIdGateway.cpp @@ -63,6 +63,17 @@ const unsigned char DT_VD_MODE2 = 0x02U; const unsigned char DT_VOICE_FR_MODE = 0x04U; const unsigned char DT_DATA_FR_MODE = 0x08U; +static bool m_killed = false; +static int m_signal = 0; + +#if !defined(_WIN32) && !defined(_WIN64) +static void sigHandler(int signum) +{ + m_killed = true; + m_signal = signum; +} +#endif + int main(int argc, char** argv) { const char* iniFile = DEFAULT_INI_FILE; @@ -81,11 +92,38 @@ int main(int argc, char** argv) } } - CDGIdGateway* gateway = new CDGIdGateway(std::string(iniFile)); +#if !defined(_WIN32) && !defined(_WIN64) + ::signal(SIGINT, sigHandler); + ::signal(SIGTERM, sigHandler); + ::signal(SIGHUP, sigHandler); +#endif - int ret = gateway->run(); + int ret = 0; - delete gateway; + do { + m_signal = 0; + m_killed = false; + + CDGIdGateway* gateway = new CDGIdGateway(std::string(iniFile)); + ret = gateway->run(); + + delete gateway; + + switch (m_signal) { + case 2: + ::LogInfo("DGIdGateway-%s exited on receipt of SIGINT", VERSION); + break; + case 15: + ::LogInfo("DGIdGateway-%s exited on receipt of SIGTERM", VERSION); + break; + case 1: + ::LogInfo("DGIdGateway-%s is restarting on receipt of SIGHUP", VERSION); + break; + default: + ::LogInfo("DGIdGateway-%s exited on receipt of an unknown signal", VERSION); + break; + } + } while (m_signal == 1); return ret; } @@ -414,7 +452,7 @@ int CDGIdGateway::run() DGID_STATUS state = DS_NOTLINKED; unsigned int nPips = 0U; - for (;;) { + while (!m_killed) { unsigned char buffer[200U]; memset(buffer, 0U, 200U); diff --git a/YSFGateway/YSFGateway.cpp b/YSFGateway/YSFGateway.cpp index 26859eb..65662d3 100644 --- a/YSFGateway/YSFGateway.cpp +++ b/YSFGateway/YSFGateway.cpp @@ -50,6 +50,17 @@ const char* DEFAULT_INI_FILE = "/etc/YSFGateway.ini"; #include #include +static bool m_killed = false; +static int m_signal = 0; + +#if !defined(_WIN32) && !defined(_WIN64) +static void sigHandler(int signum) +{ + m_killed = true; + m_signal = signum; +} +#endif + int main(int argc, char** argv) { const char* iniFile = DEFAULT_INI_FILE; @@ -68,11 +79,38 @@ int main(int argc, char** argv) } } - CYSFGateway* gateway = new CYSFGateway(std::string(iniFile)); +#if !defined(_WIN32) && !defined(_WIN64) + ::signal(SIGINT, sigHandler); + ::signal(SIGTERM, sigHandler); + ::signal(SIGHUP, sigHandler); +#endif - int ret = gateway->run(); + int ret = 0; - delete gateway; + do { + m_signal = 0; + m_killed = false; + + CYSFGateway* gateway = new CYSFGateway(std::string(iniFile)); + ret = gateway->run(); + + delete gateway; + + switch (m_signal) { + case 2: + ::LogInfo("YSFGateway-%s exited on receipt of SIGINT", VERSION); + break; + case 15: + ::LogInfo("YSFGateway-%s exited on receipt of SIGTERM", VERSION); + break; + case 1: + ::LogInfo("YSFGateway-%s is restarting on receipt of SIGHUP", VERSION); + break; + default: + ::LogInfo("YSFGateway-%s exited on receipt of an unknown signal", VERSION); + break; + } + } while (m_signal == 1); return ret; } @@ -270,7 +308,7 @@ int CYSFGateway::run() LogMessage("YSFGateway-%s is starting", VERSION); LogMessage("Built %s %s (GitID #%.7s)", __TIME__, __DATE__, gitversion); - for (;;) { + while (!m_killed) { unsigned char buffer[200U]; memset(buffer, 0U, 200U);