PPI: Missing commit
[senf.git] / Utils / Daemon / Daemon.cc
index 93bfba5..1b6e8ae 100644 (file)
@@ -89,7 +89,7 @@ prefix_ int senf::Daemon::argc()
     return argc_;
 }
 
-prefix_ char ** senf::Daemon::argv() 
+prefix_ char const ** senf::Daemon::argv() 
 {
     return argv_;
 }
@@ -107,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_;
 }
@@ -132,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;
+        }
     }
 }
 
@@ -238,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;
@@ -307,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);
@@ -365,14 +371,17 @@ prefix_ void senf::Daemon::fork()
     LIBC_CALL( ::sigaddset, (&cldsig, SIGCHLD) );
     LIBC_CALL( ::sigprocmask, (SIG_BLOCK, &cldsig, &oldsig) );
 
-    if (! senf::scheduler::empty() )
+    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"
-            "*** WARNING ***\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, () );