PPI: Missing commit
[senf.git] / Utils / Daemon / Daemon.cc
index 2b09cc0..1b6e8ae 100644 (file)
@@ -31,6 +31,7 @@
 #include <sys/stat.h>
 #include <sys/wait.h>
 #include <unistd.h>
+#include <limits.h>
 #include <fcntl.h>
 #include <errno.h>
 #include <signal.h>
@@ -88,7 +89,7 @@ prefix_ int senf::Daemon::argc()
     return argc_;
 }
 
-prefix_ char ** senf::Daemon::argv() 
+prefix_ char const ** senf::Daemon::argv() 
 {
     return argv_;
 }
@@ -106,7 +107,7 @@ namespace {
 
 prefix_ void senf::Daemon::removeDaemonArgs()
 {
-    char ** last (std::remove_if(argv_+1, argv_+argc_, IsDaemonOpt()));
+    char const ** last (std::remove_if(argv_+1, argv_+argc_, IsDaemonOpt()));
     *last = 0;
     argc_ = last - argv_;
 }
@@ -131,14 +132,19 @@ prefix_ void senf::Daemon::openLog()
                   << " Could not open \"" << stdoutLog_ << "\" for redirecting stdout.";
         stdout_ = fd;
     }
-    if (stderrLog_ == stdoutLog_)
-        stderr_ = fd;
-    else if (! stderrLog_.empty()) {
-        fd = ::open(stdoutLog_.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0666);
-        if (fd < 0)
-            SENF_THROW_SYSTEM_EXCEPTION("")
-                  << " Could not open \"" << stderrLog_ << "\" for redirecting stderr.";
-        stderr_ = fd;
+    if (! stderrLog_.empty()) {
+        if (stderrLog_ == stdoutLog_) {
+            stderr_ = ::dup(fd);
+            if (stderr_ < 0)
+                SENF_THROW_SYSTEM_EXCEPTION("::dup()");
+        } 
+        else {
+            fd = ::open(stdoutLog_.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0666);
+            if (fd < 0)
+                SENF_THROW_SYSTEM_EXCEPTION("")
+                    << " Could not open \"" << stderrLog_ << "\" for redirecting stderr.";
+            stderr_ = fd;
+        }
     }
 }
 
@@ -237,7 +243,7 @@ prefix_ void senf::Daemon::exit(unsigned code)
     throw DaemonExitException(code);
 }
 
-prefix_ int senf::Daemon::start(int argc, char ** argv)
+prefix_ int senf::Daemon::start(int argc, char const ** argv)
 {
     argc_ = argc;
     argv_ = argv;
@@ -306,6 +312,7 @@ senf::Daemon * senf::Daemon::instance_ (0);
 
 prefix_ void senf::Daemon::configure()
 {
+    // int i (not unsigned) since argc_ is int ...
     for (int i (1); i<argc_; ++i) {
         if (argv_[i] == std::string("--no-daemon"))
             daemonize(false);
@@ -363,6 +370,18 @@ prefix_ void senf::Daemon::fork()
     ::sigemptyset(&cldsig);
     LIBC_CALL( ::sigaddset, (&cldsig, SIGCHLD) );
     LIBC_CALL( ::sigprocmask, (SIG_BLOCK, &cldsig, &oldsig) );
+
+    if (! senf::scheduler::empty() ) {
+        std::cerr << 
+            "\n"
+            "*** WARNING ***\n"
+            "Scheduler not empty before fork(). THIS MUST NOT HAPPEN.\n"
+            "The scheduler will be reinitialized by the fork() and lose all registrations.\n\n";
+        senf::scheduler::detail::EventManager::instance().listEvents(std::cerr);
+        std::cerr <<
+            "\n*** WARNING ***\n"
+            "\n";
+    }
     
     LIBC_CALL_RV( pid, ::fork, () );
 
@@ -563,7 +582,7 @@ prefix_ senf::detail::DaemonWatcher::DaemonWatcher(int pid, int coutpipe, int ce
     : childPid_(pid), coutpipe_(coutpipe), cerrpipe_(cerrpipe), stdout_(stdout),
       stderr_(stderr), sigChld_(false),
       cldSignal_ (SIGCHLD, senf::membind(&DaemonWatcher::sigChld, this)),
-      timer_ ("DaemanWatcher watchdog", senf::membind(&DaemonWatcher::childOk, this)),
+      timer_ ("senf::detail::DaemonWatcher::childOk", senf::membind(&DaemonWatcher::childOk, this)),
       coutForwarder_(coutpipe_, boost::bind(&DaemonWatcher::pipeClosed, this, 1)), 
       cerrForwarder_(cerrpipe_, boost::bind(&DaemonWatcher::pipeClosed, this, 2)) 
 {
@@ -631,7 +650,7 @@ prefix_ void senf::detail::DaemonWatcher::childOk()
 
 prefix_ senf::detail::DaemonWatcher::Forwarder::Forwarder(int src, Callback cb)
     : src_(src), cb_(cb), 
-      readevent_("DaemanWatcher::Forwarder", senf::membind(&Forwarder::readData, this),
+      readevent_("senf::detail::DaemonWatcher::Forwarder::readevent", senf::membind(&Forwarder::readData, this),
                  src_, scheduler::FdEvent::EV_READ)
 {}