#include #include #include #include #include #include namespace nntpchan { ExecFrontend::ExecFrontend(const std::string &fname, char * const* env) : m_Environ(env), m_exec(fname) {} ExecFrontend::~ExecFrontend() {} void ExecFrontend::ProcessNewMessage(const fs::path &fpath) { Exec({"post", fpath}); } bool ExecFrontend::AcceptsNewsgroup(const std::string &newsgroup) { return Exec({"newsgroup", newsgroup}) == 0; } bool ExecFrontend::AcceptsMessage(const std::string &msgid) { return Exec({"msgid", msgid}) == 0; } int ExecFrontend::Exec(std::deque args) { // set up arguments const char **cargs = new char const *[args.size() + 2]; std::size_t l = 0; cargs[l++] = m_exec.c_str(); while (args.size()) { cargs[l++] = args.front().c_str(); args.pop_front(); } cargs[l] = 0; int retcode = 0; pid_t child = fork(); if (child) { waitpid(child, &retcode, 0); } else { int r = execve(m_exec.c_str(), (char *const *)cargs, m_Environ); if (r == -1) { std::cout << strerror(errno) << std::endl; exit(errno); } else exit(r); } return retcode; } }