diff options
author | Thorvald Natvig <slicer@users.sourceforge.net> | 2007-12-16 16:16:18 +0300 |
---|---|---|
committer | Thorvald Natvig <slicer@users.sourceforge.net> | 2007-12-16 16:16:18 +0300 |
commit | ea46e429de58ffa230cf8ec6e0fb02891eb4c77a (patch) | |
tree | 183f5dd9eed395744581b67b3236ae5b42290b59 /src/murmur | |
parent | 8b43b4231d1fe2c3b69419c3ac0bfa0b04f67c13 (diff) |
Handle SIGTERM and SIGHUP in Murmur
git-svn-id: https://mumble.svn.sourceforge.net/svnroot/mumble/trunk@906 05730e5d-ab1b-0410-a4ac-84af385074fa
Diffstat (limited to 'src/murmur')
-rw-r--r-- | src/murmur/DBus.cpp | 1 | ||||
-rw-r--r-- | src/murmur/UnixMurmur.cpp | 129 | ||||
-rw-r--r-- | src/murmur/UnixMurmur.h | 52 | ||||
-rw-r--r-- | src/murmur/murmur.cpp | 5 | ||||
-rw-r--r-- | src/murmur/murmur.pro | 2 |
5 files changed, 189 insertions, 0 deletions
diff --git a/src/murmur/DBus.cpp b/src/murmur/DBus.cpp index b1b2948e9..e4647950b 100644 --- a/src/murmur/DBus.cpp +++ b/src/murmur/DBus.cpp @@ -1059,6 +1059,7 @@ extern QFile *qfLog; void MetaDBus::rotateLogs(const QDBusMessage &msg) { if (! qfLog || ! qfLog->isOpen()) { MurmurDBus::qdbc.send(msg.createErrorReply("net.sourceforge.mumble.Error.nolog", "Logfile not in use")); + return; } qWarning("Logfile rotation requested from D-Bus, will reopen %s", qPrintable(Meta::mp.qsLogfile)); qfLog->close(); diff --git a/src/murmur/UnixMurmur.cpp b/src/murmur/UnixMurmur.cpp new file mode 100644 index 000000000..9a5aed04e --- /dev/null +++ b/src/murmur/UnixMurmur.cpp @@ -0,0 +1,129 @@ +/* Copyright (C) 2005-2007, Thorvald Natvig <thorvald@natvig.com> + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Neither the name of the Mumble Developers nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include <signal.h> + +#include "UnixMurmur.h" +#include "Meta.h" + +extern QFile *qfLog; + +int UnixMurmur::iHupFd[2]; +int UnixMurmur::iTermFd[2]; + +UnixMurmur::UnixMurmur() { + if (::socketpair(AF_UNIX, SOCK_STREAM, 0, iHupFd)) + qFatal("Couldn't create HUP socketpair"); + + if (::socketpair(AF_UNIX, SOCK_STREAM, 0, iTermFd)) + qFatal("Couldn't create TERM socketpair"); + + qsnHup = new QSocketNotifier(iHupFd[1], QSocketNotifier::Read, this); + qsnTerm = new QSocketNotifier(iTermFd[1], QSocketNotifier::Read, this); + + connect(qsnHup, SIGNAL(activated(int)), this, SLOT(handleSigHup())); + connect(qsnTerm, SIGNAL(activated(int)), this, SLOT(handleSigTerm())); + + struct sigaction hup, term; + + hup.sa_handler = hupSignalHandler; + sigemptyset(&hup.sa_mask); + hup.sa_flags = SA_RESTART; + + if (sigaction(SIGHUP, &hup, NULL)) + qFatal("Failed to install SIGHUP handler"); + + term.sa_handler = termSignalHandler; + sigemptyset(&term.sa_mask); + term.sa_flags = SA_RESTART; + + if (sigaction(SIGTERM, &term, NULL)) + qFatal("Failed to install SIGTERM handler"); +} + +UnixMurmur::~UnixMurmur() { + delete qsnHup; + delete qsnTerm; + + qsnHup = NULL; + qsnTerm = NULL; + + close(iHupFd[0]); + close(iHupFd[1]); + close(iTermFd[0]); + close(iTermFd[1]); +} + +void UnixMurmur::hupSignalHandler(int) { + char a = 1; + ::write(iHupFd[0], &a, sizeof(a)); +} + +void UnixMurmur::termSignalHandler(int) { + char a = 1; + ::write(iTermFd[0], &a, sizeof(a)); +} + + +// Keep these two synchronized with matching actions in DBus.cpp + +void UnixMurmur::handleSigHup() { + qsnHup->setEnabled(false); + char tmp; + ::read(iHupFd[1], &tmp, sizeof(tmp)); + + if (! qfLog || ! qfLog->isOpen()) { + qWarning("Caught SIGHUP, but logfile not in use"); + } else { + qWarning("Caught SIGHUP, will reopen %s", qPrintable(Meta::mp.qsLogfile)); + qfLog->close(); + qfLog->setFileName(Meta::mp.qsLogfile); + if (! qfLog->open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) { + delete qfLog; + qfLog = NULL; + } else { + qfLog->setTextModeEnabled(true); + qWarning("Log rotated successfully"); + } + } + qsnHup->setEnabled(true); +} + +void UnixMurmur::handleSigTerm() { + qsnTerm->setEnabled(false); + char tmp; + ::read(iTermFd[1], &tmp, sizeof(tmp)); + + qWarning("Caught SIGTERM, exiting"); + + QCoreApplication::instance()->quit(); + + qsnTerm->setEnabled(true); +} diff --git a/src/murmur/UnixMurmur.h b/src/murmur/UnixMurmur.h new file mode 100644 index 000000000..f684e67c9 --- /dev/null +++ b/src/murmur/UnixMurmur.h @@ -0,0 +1,52 @@ +/* Copyright (C) 2005-2007, Thorvald Natvig <thorvald@natvig.com>
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ - Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ - Neither the name of the Mumble Developers nor the names of its
+ contributors may be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef _UNIXMURMUR_H
+#define _UNIXMURMUR_H
+
+#include "murmur_pch.h"
+
+class UnixMurmur : public QObject {
+ Q_OBJECT
+ protected:
+ static int iHupFd[2], iTermFd[2];
+ QSocketNotifier *qsnHup, *qsnTerm;
+
+ static void hupSignalHandler(int);
+ static void termSignalHandler(int);
+ public slots:
+ void handleSigHup();
+ void handleSigTerm();
+ public:
+ UnixMurmur();
+ ~UnixMurmur();
+};
+
+#endif
diff --git a/src/murmur/murmur.cpp b/src/murmur/murmur.cpp index 4b6e06071..2096fe4ad 100644 --- a/src/murmur/murmur.cpp +++ b/src/murmur/murmur.cpp @@ -39,6 +39,10 @@ #include "DBus.h" #include "Meta.h" +#ifdef Q_OS_UNIX +#include "UnixMurmur.h" +#endif + QFile *qfLog = NULL; static bool bVerbose = false; @@ -140,6 +144,7 @@ int main(int argc, char **argv) { a.setWindowIcon(icon); #else QCoreApplication a(argc, argv); + UnixMurmur unixhandler; #endif a.setApplicationName("Murmur"); a.setOrganizationName("Mumble"); diff --git a/src/murmur/murmur.pro b/src/murmur/murmur.pro index 5c677a71c..d3fb9439e 100644 --- a/src/murmur/murmur.pro +++ b/src/murmur/murmur.pro @@ -36,6 +36,8 @@ win32 { unix { CONFIG += link_pkgconfig PKGCONFIG += openssl + HEADERS += UnixMurmur.h + SOURCES += UnixMurmur.cpp TARGET = murmurd } |