#ifndef _WIN32
#include <execvpe.h>
+#include <poll.h>
using namespace icinga;
std::ostringstream outputStream;
+ pollfd pfd;
+ pfd.fd = fd;
+ pfd.events = POLLIN;
+ pfd.revents = 0;
+
for (;;) {
- int rc = read(fd, buffer, sizeof(buffer));
+ int rc1, timeout;
+
+ timeout = 0;
+
+ if (m_Timeout != 0) {
+ timeout = m_Timeout - (Utility::GetTime() - result.ExecutionStart);
+
+ if (timeout < 0) {
+ outputStream << "<Timeout exceeded.>";
+ kill(m_Pid, SIGKILL);
+ break;
+ }
+ }
+
+ rc1 = poll(&pfd, 1, timeout * 1000);
- if (rc <= 0)
- break;
+ if (rc1 > 0) {
+ int rc2 = read(fd, buffer, sizeof(buffer));
- outputStream.write(buffer, rc);
+ if (rc2 <= 0)
+ break;
+
+ outputStream.write(buffer, rc2);
+ }
}
String output = outputStream.str();
exitcode = WEXITSTATUS(status);
} else if (WIFSIGNALED(status)) {
std::ostringstream outputbuf;
- outputbuf << "Process was terminated by signal " << WTERMSIG(status);
- output = outputbuf.str();
+ outputbuf << "<Terminated by signal " << WTERMSIG(status) << ".>";
+ output = output + outputbuf.str();
exitcode = 128;
} else {
exitcode = 128;
using namespace icinga;
Process::Process(const std::vector<String>& arguments, const Dictionary::Ptr& extraEnvironment)
- : m_Arguments(arguments), m_ExtraEnvironment(extraEnvironment)
+ : m_Arguments(arguments), m_ExtraEnvironment(extraEnvironment), m_Timeout(600)
{ }
std::vector<String> Process::SplitCommand(const Value& command)
#endif
return args;
}
+
+void Process::SetTimeout(double timeout)
+{
+ m_Timeout = timeout;
+}
+
+double Process::GetTimeout(void) const
+{
+ return m_Timeout;
+}
Process(const std::vector<String>& arguments, const Dictionary::Ptr& extraEnvironment = Dictionary::Ptr());
+ void SetTimeout(double timeout);
+ double GetTimeout(void) const;
+
ProcessResult Run(void);
static std::vector<String> SplitCommand(const Value& command);
std::vector<String> m_Arguments;
Dictionary::Ptr m_ExtraEnvironment;
+ double m_Timeout;
+
#ifndef _WIN32
pid_t m_Pid;
},
%attribute dictionary "macros" {
%attribute string "*"
- }
+ },
+ %attribute number "timeout"
/* } */
}
Process::Ptr process = boost::make_shared<Process>(Process::SplitCommand(command), envMacros);
+ Value timeout = commandObj->Get("timeout");
+
+ if (!timeout.IsEmpty())
+ process->SetTimeout(timeout);
+
ProcessResult pr = process->Run();
String output = pr.Output;
Process::Ptr process = boost::make_shared<Process>(Process::SplitCommand(command), envMacros);
+ Value timeout = commandObj->Get("timeout");
+
+ if (!timeout.IsEmpty())
+ process->SetTimeout(timeout);
+
process->Run();
}
Process::Ptr process = boost::make_shared<Process>(Process::SplitCommand(command), envMacros);
+ Value timeout = commandObj->Get("timeout");
+
+ if (!timeout.IsEmpty())
+ process->SetTimeout(timeout);
+
ProcessResult pr = process->Run();
if (pr.ExitStatus != 0) {