diff --git a/servatrice/servatrice.pro b/servatrice/servatrice.pro index 9f7fcc704..86f1d960a 100755 --- a/servatrice/servatrice.pro +++ b/servatrice/servatrice.pro @@ -13,8 +13,10 @@ CONFIG += qt debug QT += network sql QT -= gui -HEADERS += src/servatrice.h \ +HEADERS += src/main.h \ + src/servatrice.h \ src/serversocketinterface.h \ + src/server_logger.h \ ../common/color.h \ ../common/serializable_item.h \ ../common/decklist.h \ @@ -37,6 +39,7 @@ HEADERS += src/servatrice.h \ SOURCES += src/main.cpp \ src/servatrice.cpp \ src/serversocketinterface.cpp \ + src/server_logger.cpp \ ../common/serializable_item.cpp \ ../common/decklist.cpp \ ../common/protocol.cpp \ diff --git a/servatrice/src/main.cpp b/servatrice/src/main.cpp index 93a4ae1f1..8dcd95fb4 100644 --- a/servatrice/src/main.cpp +++ b/servatrice/src/main.cpp @@ -22,18 +22,14 @@ #include #include #include "servatrice.h" +#include "server_logger.h" #include "rng_sfmt.h" +#ifdef Q_OS_UNIX +#include +#endif RNG_Abstract *rng; - -//void myMessageOutput(QtMsgType /*type*/, const char *msg) -//{ -// static FILE *f = NULL; -// if (!f) -// f = fopen("qdebug.txt", "w"); -// fprintf(f, "%s\n", msg); -// fflush(f); -//} +ServerLogger *logger; void testRNG() { @@ -71,14 +67,20 @@ void testRNG() int main(int argc, char *argv[]) { -// qInstallMsgHandler(myMessageOutput); - QCoreApplication app(argc, argv); app.setOrganizationName("Cockatrice"); app.setApplicationName("Servatrice"); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); - + logger = new ServerLogger; +#ifdef Q_OS_UNIX + struct sigaction hup; + hup.sa_handler = ServerLogger::hupSignalHandler; + sigemptyset(&hup.sa_mask); + hup.sa_flags = 0; + hup.sa_flags |= SA_RESTART; + sigaction(SIGHUP, &hup, 0); +#endif rng = new RNG_SFMT; std::cerr << "Servatrice " << Servatrice::versionString.toStdString() << " starting." << std::endl; diff --git a/servatrice/src/server_logger.cpp b/servatrice/src/server_logger.cpp new file mode 100644 index 000000000..60a056af3 --- /dev/null +++ b/servatrice/src/server_logger.cpp @@ -0,0 +1,49 @@ +#include "server_logger.h" +#include +#include +#include +#include +#include + +ServerLogger::ServerLogger(QObject *parent) + : QObject(parent) +{ + logFile = new QFile("server.log", this); + logFile->open(QIODevice::Append); +#ifdef Q_OS_UNIX + ::socketpair(AF_UNIX, SOCK_STREAM, 0, sigHupFD); +#endif + snHup = new QSocketNotifier(sigHupFD[1], QSocketNotifier::Read, this); + connect(snHup, SIGNAL(activated(int)), this, SLOT(handleSigHup())); +} + +ServerLogger::~ServerLogger() +{ +} + +void ServerLogger::logMessage(QString message) +{ + QTextStream stream(logFile); + stream << message << "\n"; +} + +void ServerLogger::hupSignalHandler(int /*unused*/) +{ + char a = 1; + ::write(sigHupFD[0], &a, sizeof(a)); +} + +void ServerLogger::handleSigHup() +{ + snHup->setEnabled(false); + char tmp; + ::read(sigHupFD[1], &tmp, sizeof(tmp)); + + logFile->close(); + logFile->open(QIODevice::Append); + + snHup->setEnabled(true); +} + +QFile *ServerLogger::logFile; +int ServerLogger::sigHupFD[2]; diff --git a/servatrice/src/server_logger.h b/servatrice/src/server_logger.h new file mode 100644 index 000000000..a9bd3eec1 --- /dev/null +++ b/servatrice/src/server_logger.h @@ -0,0 +1,25 @@ +#ifndef SERVER_LOGGER_H +#define SERVER_LOGGER_H + +#include + +class QSocketNotifier; +class QFile; + +class ServerLogger : public QObject { + Q_OBJECT +public: + ServerLogger(QObject *parent = 0); + ~ServerLogger(); + static void hupSignalHandler(int unused); +public slots: + void logMessage(QString message); +private slots: + void handleSigHup(); +private: + static int sigHupFD[2]; + QSocketNotifier *snHup; + static QFile *logFile; +}; + +#endif diff --git a/servatrice/src/serversocketinterface.cpp b/servatrice/src/serversocketinterface.cpp index 6b56289e9..06c2e4122 100644 --- a/servatrice/src/serversocketinterface.cpp +++ b/servatrice/src/serversocketinterface.cpp @@ -29,6 +29,8 @@ #include "protocol_items.h" #include "decklist.h" #include "server_player.h" +#include "main.h" +#include "server_logger.h" ServerSocketInterface::ServerSocketInterface(Servatrice *_server, QTcpSocket *_socket, QObject *parent) : Server_ProtocolHandler(_server, parent), servatrice(_server), socket(_socket), topLevelItem(0) @@ -76,7 +78,7 @@ void ServerSocketInterface::processProtocolItem(ProtocolItem *item) void ServerSocketInterface::readClient() { QByteArray data = socket->readAll(); - qDebug() << data; + logger->logMessage(QString(data)); xmlReader->addData(data); while (!xmlReader->atEnd()) {