summaryrefslogtreecommitdiff
path: root/src/signalController.cpp
diff options
context:
space:
mode:
authorChristian Pointner <equinox@anytun.org>2009-02-22 06:16:10 +0000
committerChristian Pointner <equinox@anytun.org>2009-02-22 06:16:10 +0000
commit5c0eb60b509edf766e649d081d30ab8dea83a8f4 (patch)
tree7e7ffa3e6aaa42f65ea13ac3297890e64b66944b /src/signalController.cpp
parentfixed build on Windows (after logging chances) (diff)
added signal controller (console control handler) to windows
Diffstat (limited to 'src/signalController.cpp')
-rw-r--r--src/signalController.cpp98
1 files changed, 91 insertions, 7 deletions
diff --git a/src/signalController.cpp b/src/signalController.cpp
index 8d9c78f..4868d55 100644
--- a/src/signalController.cpp
+++ b/src/signalController.cpp
@@ -29,16 +29,37 @@
* along with anytun. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <csignal>
-#include <map>
+#ifndef NO_SIGNALCONTROLLER
+#include <map>
#include <iostream>
-#include <boost/bind.hpp>
-#include "threadUtils.hpp"
#include "signalController.h"
#include "log.h"
+#include "threadUtils.hpp"
+#ifndef _MSC_VER
+#include <csignal>
+#include <boost/bind.hpp>
+#else
+#include <windows.h>
+#endif
+
+SignalController* SignalController::inst = NULL;
+Mutex SignalController::instMutex;
+SignalController& gSignalController = SignalController::instance();
+
+SignalController& SignalController::instance()
+{
+ Lock lock(instMutex);
+ static instanceCleaner c;
+ if(!inst)
+ inst = new SignalController();
+
+ return *inst;
+}
+
+#ifndef _MSC_VER
int SigIntHandler::handle()
{
@@ -81,14 +102,54 @@ int SigUsr2Handler::handle()
return 0;
}
+#else
+int CtrlCHandler::handle()
+{
+ cLog.msg(Log::PRIO_NOTICE) << "CTRL-C Event received, exitting";
+
+ return 1;
+}
+
+int CtrlBreakHandler::handle()
+{
+ cLog.msg(Log::PRIO_NOTICE) << "CTRL-Break Event received, ignoring";
+
+ return 0;
+}
+
+int CtrlCloseHandler::handle()
+{
+ cLog.msg(Log::PRIO_NOTICE) << "Close Event received, exitting";
+
+ return 1;
+}
+
+int CtrlLogoffHandler::handle()
+{
+ cLog.msg(Log::PRIO_NOTICE) << "LogOff Event received, exitting";
+
+ return 1;
+}
+
+int CtrlShutdownHandler::handle()
+{
+ cLog.msg(Log::PRIO_NOTICE) << "Shutdown Event received, exitting";
+
+ return 1;
+}
+#endif
SignalController::~SignalController()
{
for(HandlerMap::iterator it = handler.begin(); it != handler.end(); ++it)
delete it->second;
+
+#ifndef _MSC_VER
if(thread) delete thread;
+#endif
}
+#ifndef _MSC_VER
void SignalController::handle(void *s)
{
SignalController* self = reinterpret_cast<SignalController*>(s);
@@ -106,9 +167,18 @@ void SignalController::handle(void *s)
self->sigQueueSem.up();
}
}
+#else
+bool SignalController::handle(DWORD ctrlType)
+{
+ gSignalController.sigQueue.push(ctrlType);
+ gSignalController.sigQueueSem.up();
+ return true;
+}
+#endif
void SignalController::init()
{
+#ifndef _MSC_VER
sigset_t signal_set;
sigfillset(&signal_set);
@@ -122,7 +192,7 @@ void SignalController::init()
#else
#error The signalhandler works only with pthreads
#endif
-
+
thread = new boost::thread(boost::bind(handle, this));
handler[SIGINT] = new SigIntHandler;
@@ -131,12 +201,24 @@ void SignalController::init()
handler[SIGTERM] = new SigTermHandler;
handler[SIGUSR1] = new SigUsr1Handler;
handler[SIGUSR2] = new SigUsr2Handler;
+#else
+ if(!SetConsoleCtrlHandler((PHANDLER_ROUTINE)SignalController::handle, true)) {
+ std::stringstream msg;
+ msg << "Error on SetConsoleCtrlhandler: " << LogErrno(GetLastError());
+ throw std::runtime_error(msg.str());
+ }
+
+ handler[CTRL_C_EVENT] = new CtrlCHandler;
+ handler[CTRL_BREAK_EVENT] = new CtrlBreakHandler;
+ handler[CTRL_CLOSE_EVENT] = new CtrlCloseHandler;
+ handler[CTRL_LOGOFF_EVENT] = new CtrlLogoffHandler;
+ handler[CTRL_SHUTDOWN_EVENT] = new CtrlShutdownHandler;
+#endif
}
int SignalController::run()
{
- while(1)
- {
+ while(1) {
sigQueueSem.down();
int sigNum;
{
@@ -157,3 +239,5 @@ int SignalController::run()
}
return 0;
}
+
+#endif \ No newline at end of file