X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FUtils%2FDaemon%2FDaemon.cc;h=f39db198bf1fb88c26c5b45b8f9ec2d53cc88759;hb=5b2e9a63a43027c71ac470ac9bdecb72e8974951;hp=5cda008ee36ccb03a396ea10f4dc2b0337194199;hpb=e9c7485ed08869e7813ee36c0c5712371bad0f30;p=senf.git diff --git a/senf/Utils/Daemon/Daemon.cc b/senf/Utils/Daemon/Daemon.cc index 5cda008..f39db19 100644 --- a/senf/Utils/Daemon/Daemon.cc +++ b/senf/Utils/Daemon/Daemon.cc @@ -35,7 +35,9 @@ #include #include #include -#include +#ifdef SENF_BACKTRACE + #include +#endif #include #include #include @@ -51,7 +53,7 @@ //#include "Daemon.mpp" #define prefix_ -///////////////////////////////cc.p//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #define LIBC_CALL(fn, args) if (fn args < 0) \ SENF_THROW_SYSTEM_EXCEPTION(#fn "()") @@ -59,7 +61,7 @@ #define LIBC_CALL_RV(var, fn, args) \ int var (fn args); if (var < 0) SENF_THROW_SYSTEM_EXCEPTION(#fn "()") -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::Daemon prefix_ senf::Daemon::~Daemon() @@ -67,7 +69,7 @@ prefix_ senf::Daemon::~Daemon() if (pidfileCreated_) { try { LIBC_CALL( ::unlink, (pidfile_.c_str()) ); - } catch (Exception e) { + } catch (Exception & e) { // e << "; could not unlink " << pidfile_.c_str(); // throw; } @@ -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; } @@ -294,7 +296,7 @@ prefix_ senf::Daemon & senf::Daemon::instance() return *instance_; } -//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // protected members prefix_ senf::Daemon::Daemon() @@ -307,17 +309,18 @@ prefix_ senf::Daemon::Daemon() senf::Daemon * senf::Daemon::instance_ (0); -//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // private members 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; @@ -517,7 +520,7 @@ namespace { if (sig == SIGSEGV) std::cerr << "Invalid memory access at " << info->si_addr << "\n"; - +#ifdef SENF_BACKTRACE static void * entries[SENF_DEBUG_BACKTRACE_NUMCALLERS]; unsigned nEntries( ::backtrace(entries, SENF_DEBUG_BACKTRACE_NUMCALLERS) ); @@ -527,7 +530,7 @@ namespace { std::cerr << "Backtrace:\n"; senf::formatBacktrace(std::cerr, entries, nEntries); std::cerr << "-- \n"; - +#endif //SENF_BACKTRACE if (sig != SIGUSR2) { ::signal(sig, SIG_DFL); ::kill(::getpid(), sig); @@ -536,7 +539,7 @@ namespace { } -#endif +#endif // SENF_DEBUG namespace { void sighupHandler(int sig) @@ -568,13 +571,15 @@ 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 } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::detail::DaemonWatcher prefix_ senf::detail::DaemonWatcher::DaemonWatcher(int pid, int coutpipe, int cerrpipe, @@ -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) @@ -599,7 +604,7 @@ prefix_ void senf::detail::DaemonWatcher::run() scheduler::process(); } -//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // private members prefix_ void senf::detail::DaemonWatcher::pipeClosed(int id) @@ -645,11 +650,11 @@ prefix_ void senf::detail::DaemonWatcher::childOk() scheduler::terminate(); } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // 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()); @@ -736,7 +741,7 @@ prefix_ void senf::detail::DaemonWatcher::Forwarder::writeData(int event, Target #undef LIBC_CALL #undef LIBC_CALL_RV -///////////////////////////////cc.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_ //#include "Daemon.mpp"