X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FDaemon%2FDaemon.cc;h=1b6e8ae9a62817b28f81fc36a462ebb24c579745;hb=a1fdb7bb122f0b05be809a922d4b7ef5e125fa67;hp=89dbcec0a91be8cabe0679f69fb2e89fcf7a05df;hpb=db007c39287e3c666dd6b53edc8c3404617c7dd5;p=senf.git diff --git a/Utils/Daemon/Daemon.cc b/Utils/Daemon/Daemon.cc index 89dbcec..1b6e8ae 100644 --- a/Utils/Daemon/Daemon.cc +++ b/Utils/Daemon/Daemon.cc @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -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); ioffset >= buffer_.size()) - Scheduler::instance().remove(i->fd); + targets_.clear_and_destroy(DestroyDelete()); } prefix_ void senf::detail::DaemonWatcher::Forwarder::addTarget(int fd) { - Target target = { fd, 0 }; - targets_.push_back(target); + targets_.push_back(*(new Target(*this, fd))); } prefix_ void senf::detail::DaemonWatcher::Forwarder::readData(int event) @@ -660,17 +672,18 @@ prefix_ void senf::detail::DaemonWatcher::Forwarder::readData(int event) while (1) { n = ::read(src_,buf,1024); if (n<0) { - if (errno != EINTR) SENF_THROW_SYSTEM_EXCEPTION("::read()"); - } else + if (errno != EINTR) + SENF_THROW_SYSTEM_EXCEPTION("::read()"); + } + else break; } if (n == 0) { - // Hangup - Scheduler::instance().remove(src_); if (buffer_.empty()) cb_(); src_ = -1; + readevent_.disable(); return; } @@ -679,20 +692,16 @@ prefix_ void senf::detail::DaemonWatcher::Forwarder::readData(int event) for (Targets::iterator i (targets_.begin()); i != targets_.end(); ++i) if (i->offset >= buffer_.size()) - Scheduler::instance().add( i->fd, - boost::bind(&Forwarder::writeData, this, _1, i), - Scheduler::EV_WRITE ); + i->writeevent.enable(); buffer_.insert(buffer_.end(), buf, buf+n); } -prefix_ void senf::detail::DaemonWatcher::Forwarder::writeData(int event, - Targets::iterator target) +prefix_ void senf::detail::DaemonWatcher::Forwarder::writeData(int event, Target * target) { - if (event != Scheduler::EV_WRITE) { + if (event != scheduler::FdEvent::EV_WRITE) { // Broken pipe while writing data ? Not much, we can do here, we just drop the data - Scheduler::instance().remove(target->fd); - targets_.erase(target); + targets_.erase_and_destroy(Targets::current(*target),DestroyDelete()); if (targets_.empty() && src_ == -1) cb_(); return; @@ -719,7 +728,7 @@ prefix_ void senf::detail::DaemonWatcher::Forwarder::writeData(int event, i->offset -= n; if (target->offset >= buffer_.size()) - Scheduler::instance().remove(target->fd); + target->writeevent.disable(); if (src_ == -1 && (buffer_.empty() || targets_.empty())) cb_(); }