Scheduler: Implement PollTimerSource
[senf.git] / Utils / Daemon / Daemon.cc
index d6b8d91..8cbf98f 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,8 +132,11 @@ prefix_ void senf::Daemon::openLog()
                   << " Could not open \"" << stdoutLog_ << "\" for redirecting stdout.";
         stdout_ = fd;
     }
-    if (stderrLog_ == stdoutLog_)
-        stderr_ = fd;
+    if (stderrLog_ == stdoutLog_) {
+        stderr_ = ::dup(fd);
+        if (stderr_ < 0)
+            SENF_THROW_SYSTEM_EXCEPTION("::dup()");
+    } 
     else if (! stderrLog_.empty()) {
         fd = ::open(stdoutLog_.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0666);
         if (fd < 0)
@@ -237,7 +241,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 +310,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);
@@ -572,7 +577,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)) 
 {
@@ -640,7 +645,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)
 {}