X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FUtils%2FDaemon%2FDaemon.cc;h=f866dca97a7919c1212e5bf9c98474c999aee0d6;hb=78a6e233083efa63a9cd0684a92abc64202a9ee7;hp=1b6e8ae9a62817b28f81fc36a462ebb24c579745;hpb=601d1f509f5bb24df167a4dd5a20da67a0af9af8;p=senf.git diff --git a/senf/Utils/Daemon/Daemon.cc b/senf/Utils/Daemon/Daemon.cc index 1b6e8ae..f866dca 100644 --- a/senf/Utils/Daemon/Daemon.cc +++ b/senf/Utils/Daemon/Daemon.cc @@ -35,16 +35,18 @@ #include #include #include -#include +#ifdef SENF_DEBUG + #include +#endif #include #include #include #include #include -#include "../Exception.hh" -#include "../membind.hh" -#include "../Backtrace.hh" -#include "../signalnames.hh" +#include +#include +#include +#include // #define __USE_GNU #include @@ -84,12 +86,12 @@ prefix_ bool senf::Daemon::daemon() return daemonize_; } -prefix_ int senf::Daemon::argc() +prefix_ int senf::Daemon::argc() { return argc_; } -prefix_ char const ** senf::Daemon::argv() +prefix_ char const ** senf::Daemon::argv() { return argv_; } @@ -137,7 +139,7 @@ prefix_ void senf::Daemon::openLog() 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) @@ -152,21 +154,21 @@ prefix_ void senf::Daemon::logReopen() { if (! stdoutLog_.empty()) { int fd (::open(stdoutLog_.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0666)); - if (fd < 0) + if (fd < 0) goto error; - if (::dup2(fd, 1) < 0) + if (::dup2(fd, 1) < 0) goto error; if (stderrLog_ == stdoutLog_) { - if (::dup2(fd, 2) < 0) + if (::dup2(fd, 2) < 0) goto error; return; } } if (! stderrLog_.empty()) { int fd (::open(stderrLog_.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0666)); - if (fd < 0) + if (fd < 0) goto error; - if (::dup2(fd, 2) < 0) + if (::dup2(fd, 2) < 0) goto error; } return; @@ -192,7 +194,7 @@ namespace { prefix_ void senf::Daemon::detach() { if (daemonize_ && ! detached_) { - // Wow .. ouch .. + // Wow .. ouch .. // To ensure all data is written to the console log file in the correct order, we suspend // execution here until the parent process tells us to continue via SIGUSR1: We block // SIGUSR1 and install our own signal handler saving the old handler and signal mask. Then @@ -260,7 +262,7 @@ prefix_ int senf::Daemon::start(int argc, char const ** argv) if (pidfileCreate()) pidfileCreated_ = true; else { - std::cerr << "PID file '" << pidfile_ + std::cerr << "PID file '" << pidfile_ << "' creation failed. Daemon running ?" << std::endl; return 1; } @@ -314,10 +316,11 @@ prefix_ void senf::Daemon::configure() { // int i (not unsigned) since argc_ is int ... for (int i (1); i> old_pid) - || old_pid < 0 - || ::kill(old_pid, 0) >= 0 + || old_pid < 0 + || ::kill(old_pid, 0) >= 0 || errno == EPERM ) { LIBC_CALL( ::unlink, (tempname.c_str()) ); return false; @@ -493,7 +496,7 @@ prefix_ bool senf::Daemon::pidfileCreate() return false; } } - + { std::ofstream pidf (tempname.c_str()); pidf << ::getpid() << std::endl; @@ -568,7 +571,9 @@ prefix_ void senf::Daemon::installSighandlers() ::sigaction(SIGFPE, &sa, NULL); ::sigaction(SIGBUS, &sa, NULL); ::sigaction(SIGSEGV, &sa, NULL); +#ifdef SIGSTKFLT //SIGSTKFLT is used for stack faults on coprocessors. That condition doesn't exist on MIPS ::sigaction(SIGSTKFLT, &sa, NULL); +#endif ::sigaction(SIGSYS, &sa, NULL); ::sigaction(SIGUSR2, &sa, NULL); #endif @@ -583,8 +588,8 @@ prefix_ senf::detail::DaemonWatcher::DaemonWatcher(int pid, int coutpipe, int ce stderr_(stderr), sigChld_(false), cldSignal_ (SIGCHLD, senf::membind(&DaemonWatcher::sigChld, 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)) + coutForwarder_(coutpipe_, boost::bind(&DaemonWatcher::pipeClosed, this, 1)), + cerrForwarder_(cerrpipe_, boost::bind(&DaemonWatcher::pipeClosed, this, 2)) { coutForwarder_.addTarget(1); if (stdout_ >= 0) @@ -649,7 +654,7 @@ prefix_ void senf::detail::DaemonWatcher::childOk() // senf::detail::DaemonWatcher::Forwarder prefix_ senf::detail::DaemonWatcher::Forwarder::Forwarder(int src, Callback cb) - : src_(src), cb_(cb), + : src_(src), cb_(cb), readevent_("senf::detail::DaemonWatcher::Forwarder::readevent", senf::membind(&Forwarder::readData, this), src_, scheduler::FdEvent::EV_READ) {} @@ -672,16 +677,16 @@ prefix_ void senf::detail::DaemonWatcher::Forwarder::readData(int event) while (1) { n = ::read(src_,buf,1024); if (n<0) { - if (errno != EINTR) + if (errno != EINTR) SENF_THROW_SYSTEM_EXCEPTION("::read()"); - } - else + } + else break; } if (n == 0) { if (buffer_.empty()) - cb_(); + cb_(); src_ = -1; readevent_.disable(); return; @@ -698,7 +703,7 @@ prefix_ void senf::detail::DaemonWatcher::Forwarder::readData(int event) } prefix_ void senf::detail::DaemonWatcher::Forwarder::writeData(int event, Target * target) -{ +{ if (event != scheduler::FdEvent::EV_WRITE) { // Broken pipe while writing data ? Not much, we can do here, we just drop the data targets_.erase_and_destroy(Targets::current(*target),DestroyDelete());