#include <algorithm>
#include <boost/algorithm/string/predicate.hpp>
#include <boost/algorithm/string/trim.hpp>
+#include <boost/format.hpp>
#include "../Exception.hh"
#include "../membind.hh"
#define prefix_
///////////////////////////////cc.p////////////////////////////////////////
-#define LIBC_CALL(fn, args) if (fn args < 0) throw SystemException(#fn "()")
-#define LIBC_CALL_RV(var, fn, args) int var (fn args); if (var < 0) throw SystemException(#fn "()")
+#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()
{
- if (! pidfile_.empty())
- LIBC_CALL( ::unlink, (pidfile_.c_str()) );
+ if (! pidfile_.empty()) {
+ try {
+ LIBC_CALL( ::unlink, (pidfile_.c_str()) );
+ } catch (Exception e) {
+ // e << "; could not unlink " << pidfile_.c_str();
+ // throw;
+ }
+ }
}
prefix_ void senf::Daemon::daemonize(bool v)
if (! stdoutLog_.empty()) {
fd = ::open(stdoutLog_.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0666);
if (fd < 0)
- throw SystemException("::open()");
+ SENF_THROW_SYSTEM_EXCEPTION("")
+ << " Could not open \"" << stdoutLog_ << "\" for redirecting stdout.";
stdout_ = fd;
}
if (stderrLog_ == stdoutLog_)
else if (! stderrLog_.empty()) {
fd = ::open(stdoutLog_.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0666);
if (fd < 0)
- throw SystemException("::open()");
+ SENF_THROW_SYSTEM_EXCEPTION("")
+ << " Could not open \"" << stderrLog_ << "\" for redirecting stderr.";
stderr_ = fd;
}
}
while (! signaled) {
::sigsuspend(&waitsig);
if (errno != EINTR)
- throw SystemException("::sigsuspend()");
+ SENF_THROW_SYSTEM_EXCEPTION("::sigsuspend()");
}
LIBC_CALL( ::sigaction, (SIGUSR1, &oldact, 0) );
// was some race condition, probably over NFS.
std::string tempname;
+ boost::format linkErrorFormat(" Could not link \"%1%\" to \"%2%\".");
{
char hostname[HOST_NAME_MAX+1];
while (1) {
{
std::ofstream pidf (tempname.c_str());
+ if (! pidf)
+ SENF_THROW_SYSTEM_EXCEPTION("")
+ << " Could not open pidfile \"" << tempname << "\" for output.";
pidf << ::getpid() << std::endl;
+ if (! pidf)
+ SENF_THROW_SYSTEM_EXCEPTION("")
+ << " Could not write to pidfile \"" << tempname << "\".";
}
if (::link(tempname.c_str(), pidfile_.c_str()) < 0) {
if (errno != EEXIST)
- throw SystemException("::link()");
+ SENF_THROW_SYSTEM_EXCEPTION("") << linkErrorFormat % pidfile_ % tempname;
}
else {
struct ::stat s;
LIBC_CALL( ::unlink, (tempname.c_str() ));
if (::link(pidfile_.c_str(), tempname.c_str()) < 0) {
- if (errno != ENOENT) throw SystemException("::link()");
+ if (errno != ENOENT)
+ SENF_THROW_SYSTEM_EXCEPTION("") << linkErrorFormat % tempname % pidfile_;
// Hmm ... the pidfile mysteriously disappeared ... try again.
continue;
}
if (sigChld_)
childDied(); // does not return
if (::kill(childPid_, SIGUSR1) < 0)
- if (errno != ESRCH) throw SystemException("::kill()");
+ if (errno != ESRCH) SENF_THROW_SYSTEM_EXCEPTION("::kill()");
Scheduler::instance().timeout(
Scheduler::instance().eventTime() + ClockService::seconds(1),
senf::membind(&DaemonWatcher::childOk, this));
prefix_ void senf::detail::DaemonWatcher::childDied()
{
int status (0);
- if (::waitpid(childPid_,&status,0) < 0) throw SystemException("::waitpid()");
+ if (::waitpid(childPid_,&status,0) < 0) SENF_THROW_SYSTEM_EXCEPTION("::waitpid()");
if (WIFSIGNALED(status)) {
::signal(WTERMSIG(status),SIG_DFL);
::kill(::getpid(), WTERMSIG(status));
while (1) {
n = ::read(src_,buf,1024);
if (n<0) {
- if (errno != EINTR) throw SystemException("::read()");
+ if (errno != EINTR) SENF_THROW_SYSTEM_EXCEPTION("::read()");
} else
break;
}
int w (::write(target->fd, buf, n));
if (w < 0) {
- if (errno != EINTR) throw SystemException("::write()");
+ if (errno != EINTR) SENF_THROW_SYSTEM_EXCEPTION("::write()");
return;
}
target->offset += w;