if(stdout_dest==CAPTURE || stderr_dest==CAPTURE)
capture_pipe = new IO::Pipe;
+ prepare();
+
if((pid = fork()))
{
if(pid==-1)
}
Task::Status ExternalTask::check()
+{
+ return do_wait(false);
+}
+
+Task::Status ExternalTask::wait()
+{
+ return do_wait(true);
+}
+
+Task::Status ExternalTask::do_wait(bool block)
{
if(pid>0)
{
- // XXX This is sub-optimal, should have support for a blocking wait
int status;
- if(waitpid(pid, &status, WNOHANG)==pid)
+ if(waitpid(pid, &status, (block ? 0 : WNOHANG))==pid)
{
if(WIFEXITED(status))
exit_code = WEXITSTATUS(status);
{
stderr_dest = d;
}
+
+string ExternalTask::run_and_capture_output(const Arguments &argv, const FS::Path &wd)
+{
+ ExternalTask task(argv, wd);
+ task.set_stdout(CAPTURE);
+ task.set_stderr(IGNORE);
+ task.start();
+ if(task.wait()!=SUCCESS)
+ throw runtime_error(format("%s failed", argv.front()));
+ return task.get_output();
+}