summaryrefslogtreecommitdiffstats
path: root/src/input/pvsSyslog.cpp
diff options
context:
space:
mode:
authorSebastien Braun2010-10-06 15:19:44 +0200
committerSebastien Braun2010-10-07 09:30:24 +0200
commitaeeb2b034f50ad2938b1c32507f20070a26c1849 (patch)
tree54dfca1f4dff7202c012adfc26070cfc3c9a222c /src/input/pvsSyslog.cpp
parentInstall PolKit policy file (diff)
downloadpvs-aeeb2b034f50ad2938b1c32507f20070a26c1849.tar.gz
pvs-aeeb2b034f50ad2938b1c32507f20070a26c1849.tar.xz
pvs-aeeb2b034f50ad2938b1c32507f20070a26c1849.zip
Implement log targets for pvsprivinputd
Also: - add command line options and usage message. - change --no-fork to --daemon to bring it in line with the pvs daemon.
Diffstat (limited to 'src/input/pvsSyslog.cpp')
-rw-r--r--src/input/pvsSyslog.cpp133
1 files changed, 133 insertions, 0 deletions
diff --git a/src/input/pvsSyslog.cpp b/src/input/pvsSyslog.cpp
new file mode 100644
index 0000000..6a9be31
--- /dev/null
+++ b/src/input/pvsSyslog.cpp
@@ -0,0 +1,133 @@
+/*
+ # Copyright (c) 2009 - OpenSLX Project, Computer Center University of Freiburg
+ #
+ # This program is free software distributed under the GPL version 2.
+ # See http://openslx.org/COPYING
+ #
+ # If you have any feedback please consult http://openslx.org/feedback and
+ # send your suggestions, praise, or complaints to feedback@openslx.org
+ #
+ # General information about OpenSLX can be found at http://openslx.org/
+ # --------------------------------------------------------------------------
+ # pvsSyslog.cpp:
+ # - Send output to syslog or to a file - implementation
+ # --------------------------------------------------------------------------
+ */
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <cerrno>
+#include <syslog.h>
+#include <QFile>
+#include <QTextStream>
+#include "pvsSyslog.h"
+
+using namespace std;
+
+#define PVS_LOG_BUFSIZ 8192
+
+void PVSLogRedirector::inputAvailableOn(int fd)
+{
+ QByteArray readbuf;
+ readbuf.resize(PVS_LOG_BUFSIZ);
+ ssize_t siz;
+ bool cont = true;
+
+ do
+ {
+ siz = recv(fd, readbuf.data(), readbuf.size(), MSG_DONTWAIT);
+ if(siz > 0)
+ {
+ _buf.append(readbuf.constData(), siz);
+
+ // Send lines:
+ int oldnpos = -1;
+ int npos = -1;
+ while((npos = _buf.indexOf('\n', oldnpos + 1)) >= 0)
+ {
+ if((oldnpos + 1) == npos)
+ {
+ oldnpos = npos;
+ continue;
+ }
+ QString line = QString::fromLocal8Bit(_buf.constData() + oldnpos + 1, npos - oldnpos - 1);
+ doRedirectInput(line);
+ oldnpos = npos;
+ }
+
+ // All complete lines have been sent. Remove sent bytes from buffer.
+ _buf.remove(0, oldnpos + 1);
+
+ // If line length is too large, send it now.
+ if(_buf.size() >= BUFSIZ)
+ {
+ QString longLine = QString::fromLocal8Bit(_buf.constData(), _buf.size());
+ doRedirectInput(longLine);
+ _buf.clear();
+ }
+ }
+ else if(siz == 0)
+ {
+ // Socket closed on other end.
+ break;
+ }
+ else if(siz < 0)
+ {
+ int err = errno;
+ switch(err)
+ {
+ case EAGAIN:
+#if defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN)
+ case EWOULDBLOCK:
+#endif
+ // We read all there is to read.
+ cont = false;
+ break;
+ default:
+ // Something happened.
+ // We can't inform the user via qDebug() and friends as that would loop right back to us again,
+ // so we emit a log line.
+ doRedirectInput(QString("Error in logging code: Could not read log input: %s").arg(strerror(err)));
+ cont = false;
+ }
+ }
+ }
+ while(cont);
+}
+
+PVSSyslogRedirector::PVSSyslogRedirector()
+{
+ openlog("pvsprivinputd", LOG_PID, LOG_USER);
+}
+
+PVSSyslogRedirector::~PVSSyslogRedirector()
+{
+ closelog();
+}
+
+void PVSSyslogRedirector::doRedirectInput(QString const& line)
+{
+ QByteArray bytes = line.toLocal8Bit();
+ syslog(LOG_NOTICE, "%s", bytes.data());
+}
+
+PVSLogfileRedirector::PVSLogfileRedirector(QString const& filename)
+{
+ _file = new QFile(filename, this);
+ _file->open(QIODevice::Append);
+ _stream = new QTextStream(_file);
+}
+
+PVSLogfileRedirector::~PVSLogfileRedirector()
+{
+ _stream->flush();
+ _file->close();
+ delete _stream;
+ delete _file;
+}
+
+void PVSLogfileRedirector::doRedirectInput(QString const& line)
+{
+ *_stream << line << flush;
+}