/* # 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 #include #include #include #include #include #include #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; }