diff options
Diffstat (limited to 'src/core/applicationinterface.cc')
-rw-r--r-- | src/core/applicationinterface.cc | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/core/applicationinterface.cc b/src/core/applicationinterface.cc index 9ef5c16..ba22d8c 100644 --- a/src/core/applicationinterface.cc +++ b/src/core/applicationinterface.cc @@ -6,14 +6,37 @@ #include "core/core.h" #include "filesystem/filesystem.h" +#include "sys/sys.h" #include "common/common.h" #include <iostream> #include <stdlib.h> +#include <errno.h> +#include <signal.h> + namespace core { +extern "C" void signal_handler(int signum) +{ + switch(signum){ + case SIGHUP: + case SIGINT: + case SIGQUIT: + case SIGTERM: + con_warn << "received signal " << signum << ", shutting down..." << std::endl; + if (ApplicationInterface::instance()); + ApplicationInterface::instance()->shutdown(); + exit(1); + break; + default: + con_warn << "received signal " << signum << ", terminated..." << std::endl; + exit(1); + break; + } +} + ApplicationInterface *ApplicationInterface::applicationinterface_instance = 0; ApplicationInterface::ApplicationInterface() { @@ -22,6 +45,11 @@ ApplicationInterface::ApplicationInterface() { exit(2); } applicationinterface_instance = this; + + sys::signal(SIGHUP, signal_handler); + sys::signal(SIGINT, signal_handler); + sys::signal(SIGQUIT, signal_handler); + sys::signal(SIGTERM, signal_handler); } ApplicationInterface::~ApplicationInterface() @@ -29,7 +57,7 @@ ApplicationInterface::~ApplicationInterface() applicationinterface_instance = 0; } -ApplicationInterface *ApplicationInterface::instance() +ApplicationInterface *ApplicationInterface::instance() { return applicationinterface_instance; } |