0.6.0-1 release
[manu/suphp.git] / src / API_Linux_Logger.cpp
diff --git a/src/API_Linux_Logger.cpp b/src/API_Linux_Logger.cpp
new file mode 100644 (file)
index 0000000..4c62b63
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+    suPHP - (c)2002-2005 Sebastian Marsching <sebastian@marsching.com>
+
+    This file is part of suPHP.
+
+    suPHP is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    suPHP is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with suPHP; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include <iostream>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <time.h>
+#include <unistd.h>
+#include <string.h>
+
+#include "API_Linux_Logger.hpp"
+
+using namespace suPHP;
+
+suPHP::API_Linux_Logger::API_Linux_Logger() {
+    this->ready = false;
+    this->logFd = -1;
+}
+
+void suPHP::API_Linux_Logger::log(const std::string& classification, 
+                                 const std::string& message) {
+    ::time_t ts;
+    struct ::tm *now;
+    char timestr[64] = {0};
+    std::string logline;
+    
+    ts = ::time(NULL);
+    now = ::localtime(&ts);
+
+    // Do not check for error when running strftime -
+    // we couldn't handle it anyway :-)
+    ::strftime(timestr, 64, "[%a %b %d %H:%M:%S %Y]", now);
+
+    // Construct logline
+    logline = std::string(timestr) + " [" + classification + "] " 
+       + message + "\n";
+
+    // Check wheter we have an uninitialized logfile 
+    // or write to the logfile failed
+    if (!this->isInitialized() 
+       || (write(this->logFd, logline.c_str(), logline.size()) == -1)) {
+       // Print message to stderr
+       std::cerr << "Could not write to logfile:" << std::endl
+//               << ::strerror(::errno) << std::endl
+                 << "Printing message to stderr:" << std::endl
+                 << logline << std::endl;
+    }
+}
+
+void suPHP::API_Linux_Logger::init(const Configuration& config)
+    throw (IOException) {
+    // Open logfile in append mode, create if not existing.
+    this->logFd = ::open(config.getLogfile().c_str(), 
+                        O_WRONLY|O_CREAT|O_APPEND|O_NOCTTY, 
+                        S_IRUSR|S_IWUSR);
+    
+    // Check wheter something failed
+    if (this->logFd == -1) {
+       throw IOException("Could not open logfile " + config.getLogfile(),
+                         __FILE__, __LINE__);
+    }
+    
+    // Set close-on-exec flag, because we do not want
+    // the user to write to our logfile
+    if (::fcntl(this->logFd, F_SETFD, FD_CLOEXEC)) {
+       // Ooops, something went wrong
+       throw IOException("Could not set close-on-exec flag on logfile",
+                         __FILE__, __LINE__);
+    }
+    
+    // Get log level from configuration
+    this->setLogLevel(config.getLogLevel());
+
+    // We got here, so nothing failed
+    this->ready = true;
+}
+
+bool suPHP::API_Linux_Logger::isInitialized() {
+    return this->ready;
+}