#include <fcntl.h>
#include <errno.h>
#include <signal.h>
-#include <execinfo.h>
+#ifdef SENF_DEBUG
+ #include <execinfo.h>
+#endif
#include <sstream>
#include <algorithm>
#include <boost/algorithm/string/predicate.hpp>
//#include "Daemon.mpp"
#define prefix_
-///////////////////////////////cc.p////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
#define LIBC_CALL(fn, args) if (fn args < 0) \
SENF_THROW_SYSTEM_EXCEPTION(#fn "()")
#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()
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_;
}
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)
{
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;
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
if (pidfileCreate())
pidfileCreated_ = true;
else {
- std::cerr << "PID file '" << pidfile_
+ std::cerr << "PID file '" << pidfile_
<< "' creation failed. Daemon running ?" << std::endl;
return 1;
}
return *instance_;
}
-////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// protected members
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<argc_; ++i) {
- if (argv_[i] == std::string("--no-daemon"))
+ std::string argv (argv_[i]);
+ if (argv == "--no-daemon")
daemonize(false);
- else if (boost::starts_with(argv_[i], std::string("--console-log="))) {
- std::string arg (std::string(argv_[i]).substr(14u));
+ else if (boost::starts_with(argv, "--console-log=")) {
+ std::string arg (argv.substr(14u));
std::string::size_type komma (arg.find(','));
if (komma == std::string::npos) {
boost::trim(arg);
else if (! arg2.empty() ) consoleLog(arg2, StdErr);
}
}
- else if (boost::starts_with(argv_[i], std::string("--pid-file=")))
+ else if (boost::starts_with(argv, "--pid-file="))
pidFile(std::string(std::string(argv_[i]), 11u));
}
}
LIBC_CALL( ::sigprocmask, (SIG_BLOCK, &cldsig, &oldsig) );
if (! senf::scheduler::empty() ) {
- std::cerr <<
+ std::cerr <<
"\n"
"*** WARNING ***\n"
"Scheduler not empty before fork(). THIS MUST NOT HAPPEN.\n"
"\n*** WARNING ***\n"
"\n";
}
-
+
LIBC_CALL_RV( pid, ::fork, () );
if (pid == 0) {
// Ouch ... ensure, the daemon watcher does not remove the pidfile ...
pidfile_ = "";
-
+
LIBC_CALL( ::close, (coutpipe[1]) );
LIBC_CALL( ::close, (cerrpipe[1]) );
}
if (::link(tempname.c_str(), pidfile_.c_str()) < 0) {
- if (errno != EEXIST)
+ if (errno != EEXIST)
SENF_THROW_SYSTEM_EXCEPTION("") << linkErrorFormat % pidfile_ % tempname;
}
else {
int old_pid (-1);
std::ifstream pidf (pidfile_.c_str());
if ( ! (pidf >> 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;
return false;
}
}
-
+
{
std::ofstream pidf (tempname.c_str());
pidf << ::getpid() << std::endl;
::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,
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)
scheduler::process();
}
-////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// private members
prefix_ void senf::detail::DaemonWatcher::pipeClosed(int id)
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)
{}
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;
}
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());
#undef LIBC_CALL
#undef LIBC_CALL_RV
-///////////////////////////////cc.e////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
#undef prefix_
//#include "Daemon.mpp"