summaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2011-08-10 00:28:31 -0400
committerAdam <Adam@anope.org>2011-08-10 00:28:31 -0400
commit13bcc4ef14c0c61e8ed578ac9346291ae731b8df (patch)
tree29f024c498fe0f713183a3e6ddd0e82f22567565 /src/main.cpp
parentce92c9b21b99f6a2e2d2a79ce119233699c1a81a (diff)
Replace the old sigaction for a signal when our Signal destructs
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp7
1 files changed, 6 insertions, 1 deletions
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<Signal *>::iterator it = std::find(SignalHandlers.begin(), SignalHandlers.end(), this);
if (it != SignalHandlers.end())
SignalHandlers.erase(it);
+
+ sigaction(this->signal, &this->old, NULL);
}