IBR-DTNSuite  0.8
ibrcommon/ibrcommon/SyslogStream.cpp
Go to the documentation of this file.
00001 /*
00002  * File:   SyslogStream.cpp
00003  * Author: morgenro
00004  *
00005  * Created on 17. November 2009, 13:43
00006  */
00007 
00008 #include "ibrcommon/config.h"
00009 #include "ibrcommon/SyslogStream.h"
00010 #include <syslog.h>
00011 
00012 namespace ibrcommon
00013 {
00014         std::ostream &slog = SyslogStream::getStream();
00015 
00016         SyslogStream::SyslogStream() : m_buf( BUF_SIZE+1 ), _prio(SYSLOG_INFO)
00017         {
00018                 setp( &m_buf[0], &m_buf[0] + (m_buf.size()-1) );
00019         }
00020 
00021         SyslogStream::~SyslogStream()
00022         {
00023         }
00024 
00025         void SyslogStream::open(char *name, int option, int facility)
00026         {
00027                 ::openlog(name, option, facility);
00028         }
00029 
00030         std::ostream& SyslogStream::getStream()
00031         {
00032                 static SyslogStream syslogbuf;
00033                 static std::ostream stream(&syslogbuf);
00034 
00035                 return stream;
00036         }
00037 
00038         int SyslogStream::sync()
00039         {
00040                 if( pptr() > pbase() )
00041                         writeToDevice();
00042                 return 0; // 0 := Ok
00043         }
00044 
00045         void SyslogStream::setPriority(const SyslogPriority &prio)
00046         {
00047                 _prio = prio;
00048         }
00049 
00050         void SyslogStream::writeToDevice()
00051         {
00052                 *pptr() = 0; // End Of String
00053                 ::syslog( _prio, "%s", pbase() );
00054                 setp( &m_buf[0], &m_buf[0] + (m_buf.size()-1) );
00055         }
00056 
00057         std::ostream &operator<<(std::ostream &stream, const SyslogPriority &prio)
00058         {
00059                 SyslogStream *slog = dynamic_cast<SyslogStream*>(stream.rdbuf());
00060 
00061                 if (slog != NULL)
00062                 {
00063                         slog->setPriority(prio);
00064                 }
00065                 else
00066                 {
00067                         const char data = prio;
00068                         stream.write(&data, sizeof(char));
00069                 }
00070 
00071                 return stream;
00072         }
00073 }