mirror of
https://github.com/mumble-voip/mumble.git
synced 2025-10-26 11:19:16 +00:00
Handle SIGTERM and SIGHUP in Murmur
git-svn-id: https://mumble.svn.sourceforge.net/svnroot/mumble/trunk@906 05730e5d-ab1b-0410-a4ac-84af385074fa
This commit is contained in:
parent
8b43b4231d
commit
ea46e429de
@ -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();
|
||||
|
||||
129
src/murmur/UnixMurmur.cpp
Normal file
129
src/murmur/UnixMurmur.cpp
Normal file
@ -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);
|
||||
}
|
||||
52
src/murmur/UnixMurmur.h
Normal file
52
src/murmur/UnixMurmur.h
Normal file
@ -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
|
||||
@ -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");
|
||||
|
||||
@ -36,6 +36,8 @@ win32 {
|
||||
unix {
|
||||
CONFIG += link_pkgconfig
|
||||
PKGCONFIG += openssl
|
||||
HEADERS += UnixMurmur.h
|
||||
SOURCES += UnixMurmur.cpp
|
||||
TARGET = murmurd
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user