#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
+#include <limits.h>
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
return argc_;
}
-prefix_ char ** senf::Daemon::argv()
+prefix_ char const ** senf::Daemon::argv()
{
return argv_;
}
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_;
}
<< " 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;
+ }
}
}
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;
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);
::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, () );
: 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))
{
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)
{}