summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/inspircd.h9
-rw-r--r--src/inspircd.cpp6
2 files changed, 14 insertions, 1 deletions
diff --git a/include/inspircd.h b/include/inspircd.h
index fc5a15da1..984122a18 100644
--- a/include/inspircd.h
+++ b/include/inspircd.h
@@ -727,12 +727,19 @@ class InspIRCd : public classbase
*/
static void Rehash(int status);
- /** Causes the server to exit immediately
+ /** Causes the server to exit after unloading modules and
+ * closing all open file descriptors.
+ *
* @param The exit code to give to the operating system
* (See the ExitStatus enum for valid values)
*/
static void Exit(int status);
+ /** Causes the server to exit immediately with exit code 0.
+ * The status code is required for signal handlers, and ignored.
+ */
+ static void QuickExit(int status);
+
/** Return a count of users, unknown and known connections
* @return The number of users
*/
diff --git a/src/inspircd.cpp b/src/inspircd.cpp
index 6630cde5d..14bff2bef 100644
--- a/src/inspircd.cpp
+++ b/src/inspircd.cpp
@@ -220,6 +220,11 @@ void InspIRCd::SetSignals()
signal(SIGCHLD, SIG_IGN);
}
+void InspIRCd::QuickExit(int status)
+{
+ exit(0);
+}
+
bool InspIRCd::DaemonSeed()
{
int childpid;
@@ -234,6 +239,7 @@ bool InspIRCd::DaemonSeed()
* if the child pid is still around. If theyre not,
* they threw an error and we should give up.
*/
+ signal(SIGTERM, InspIRCd::QuickExit);
while (kill(childpid, 0) != -1)
sleep(1);
exit(0);