diff -r -u slim-1.3.6/log.cpp slim-1.3.6.new/log.cpp --- slim-1.3.6/log.cpp 2013-10-02 00:38:05.000000000 +0200 +++ slim-1.3.6.new/log.cpp 2016-02-12 23:31:58.229257277 +0100 @@ -1,23 +1,37 @@ #include "log.h" #include +#include +#include +#include + bool LogUnit::openLog(const char * filename) { - if (logFile.is_open()) { + if ( closeLog() ) + { cerr << APPNAME << ": opening a new Log file, while another is already open" << endl; - logFile.close(); } - logFile.open(filename, ios_base::app); + + // go through quite some trouble to get a close-on-exec file + // descriptor and wrapping it into an ostream object for easing + // logging + + fileBuffer.open( filename, ios_base::app ); + fcntl(fileBuffer.fd(), F_SETFD, FD_CLOEXEC); + logFile.rdbuf( &fileBuffer ); return !(logFile.fail()); } -void +bool LogUnit::closeLog() { - if (logFile.is_open()) - logFile.close(); + if( ! fileBuffer.is_open() ) + return false; + + fileBuffer.close(); + return true; } diff -r -u slim-1.3.6/log.h slim-1.3.6.new/log.h --- slim-1.3.6/log.h 2013-10-02 00:38:05.000000000 +0200 +++ slim-1.3.6.new/log.h 2016-02-12 23:31:09.797498557 +0100 @@ -8,16 +8,20 @@ #include "PAM.h" #endif #include "const.h" +#include #include using namespace std; static class LogUnit { - ofstream logFile; + typedef __gnu_cxx::stdio_filebuf FileDescBuffer; + FileDescBuffer fileBuffer; + ostream logFile; public: bool openLog(const char * filename); - void closeLog(); + bool closeLog(); + LogUnit() : logFile(&fileBuffer) { } ~LogUnit() { closeLog(); } template