diff options
author | Adam <Adam@anope.org> | 2011-05-23 04:41:51 -0400 |
---|---|---|
committer | Adam <Adam@anope.org> | 2011-05-23 04:41:51 -0400 |
commit | 8bf8832b70dea28e2048d5952ee03247f12bda92 (patch) | |
tree | f76f670690c105ec8f9ca079d868e930fd8f205b /src/main.cpp | |
parent | 4dd7e261f5704569856b5854dcc1f68010f0aaad (diff) |
Rewrote the signal handling to use sigaction
Diffstat (limited to 'src/main.cpp')
-rw-r--r-- | src/main.cpp | 98 |
1 files changed, 35 insertions, 63 deletions
diff --git a/src/main.cpp b/src/main.cpp index 199b3162f..4a02e532d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -61,9 +61,6 @@ bool restarting = false; /* Contains a message as to why services is terminating */ Anope::string quitmsg; -/* Should we update the databases now? */ -bool save_data = false; - /* At what time were we started? */ time_t start_time = time(NULL); @@ -83,8 +80,7 @@ class UpdateTimer : public Timer void Tick(time_t) { - if (!readonly) - save_databases(); + save_databases(); } }; @@ -212,66 +208,45 @@ void save_databases() /*************************************************************************/ -/* If we get a weird signal, come here. */ +std::vector<Signal *> Signal::SignalHandlers; -void sighandler(int signum) +void Signal::SignalHandler(int signal) { - if (quitmsg.empty()) -#ifndef _WIN32 - quitmsg = Anope::string("Services terminating via signal ") + strsignal(signum) + " (" + stringify(signum) + ")"; -#else - quitmsg = Anope::string("Services terminating via signal ") + stringify(signum); -#endif + for (unsigned i = 0, j = SignalHandlers.size(); i < j; ++i) + if (SignalHandlers[i]->signal == signal) + SignalHandlers[i]->called = true; +} - if (started) - { - switch (signum) +void Signal::Process() +{ + for (unsigned i = 0, j = SignalHandlers.size(); i < j; ++i) + if (SignalHandlers[i]->called == true) { -#ifndef _WIN32 - case SIGHUP: - { - Log() << "Received SIGHUP: Saving databases & rehashing configuration"; - - save_databases(); - - ServerConfig *old_config = Config; - try - { - Config = new ServerConfig(); - FOREACH_MOD(I_OnReload, OnReload()); - delete old_config; - } - catch (const ConfigException &ex) - { - Config = old_config; - Log() << "Error reloading configuration file: " << ex.GetReason(); - } - break; - } -#endif - case SIGINT: - case SIGTERM: - signal(signum, SIG_IGN); -#ifndef _WIN32 - signal(SIGHUP, SIG_IGN); -#endif + Signal *s = SignalHandlers[i]; + s->called = false; + s->OnSignal(); + } +} -#ifndef _WIN32 - Log() << "Received " << strsignal(signum) << " signal (" << signum << "), exiting."; -#else - Log() << "Received signal " << signum << ", exiting."; -#endif +Signal::Signal(int s) : called(false), signal(s) +{ + this->action.sa_flags = 0; + sigemptyset(&this->action.sa_mask); + this->action.sa_handler = SignalHandler; + + sigaction(s, &this->action, NULL); - save_databases(); - quitting = true; - default: - break; - } - } + SignalHandlers.push_back(this); +} - FOREACH_MOD(I_OnSignal, OnSignal(signum, quitmsg)); +Signal::~Signal() +{ + std::vector<Signal *>::iterator it = std::find(SignalHandlers.begin(), SignalHandlers.end(), this); + if (it != SignalHandlers.end()) + SignalHandlers.erase(it); } + /*************************************************************************/ /** The following comes from InspIRCd to get the full path of the Anope executable @@ -388,6 +363,10 @@ int main(int ac, char **av, char **envp) { Log(LOG_DEBUG_2) << "Top of main loop"; + /* Process signals */ + Signal::Process(); + + /* Process timers */ if (Anope::CurTime - last_check >= Config->TimeoutCheck) { TimerManager::TickTimers(Anope::CurTime); @@ -405,13 +384,6 @@ int main(int ac, char **av, char **envp) SocketEngine::Process(); } - if (save_data) - { - ircdproto->SendGlobops(NULL, "Updating databases on shutdown, please wait."); - save_databases(); - save_data = false; - } - if (restarting) { FOREACH_MOD(I_OnRestart, OnRestart()); |