From 13bcc4ef14c0c61e8ed578ac9346291ae731b8df Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 10 Aug 2011 00:28:31 -0400 Subject: [PATCH] Replace the old sigaction for a signal when our Signal destructs --- include/services.h | 2 +- src/main.cpp | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/include/services.h b/include/services.h index addaf6ae8..6e7243c10 100644 --- a/include/services.h +++ b/include/services.h @@ -244,7 +244,7 @@ class Signal static std::vector SignalHandlers; static void SignalHandler(int signal); - struct sigaction action; + struct sigaction action, old; sig_atomic_t called; public: static void Process(); diff --git a/src/main.cpp b/src/main.cpp index f4316d6e0..97ee2a844 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -225,11 +225,14 @@ void Signal::Process() Signal::Signal(int s) : called(false), signal(s) { + memset(&this->old, 0, sizeof(this->old)); + this->action.sa_flags = 0; sigemptyset(&this->action.sa_mask); this->action.sa_handler = SignalHandler; - sigaction(s, &this->action, NULL); + if (sigaction(s, &this->action, &this->old) == -1) + throw CoreException("Unable to install signal " + stringify(s) + ": " + Anope::LastError()); SignalHandlers.push_back(this); } @@ -239,6 +242,8 @@ Signal::~Signal() std::vector::iterator it = std::find(SignalHandlers.begin(), SignalHandlers.end(), this); if (it != SignalHandlers.end()) SignalHandlers.erase(it); + + sigaction(this->signal, &this->old, NULL); }