X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fexternaltask.cpp;h=5f5d394597b3a7d073d80bc2caa830172ba97d92;hb=0cf7bb122ef4c0fc46fbb2aaaf1a9d6d5ccec0f1;hp=0da81e519cc05eba437855e02da99d81722302d1;hpb=e2dc7122774e5d8de07731f3abe15ec0a9ffa643;p=builder.git diff --git a/source/externaltask.cpp b/source/externaltask.cpp index 0da81e5..5f5d394 100644 --- a/source/externaltask.cpp +++ b/source/externaltask.cpp @@ -91,12 +91,21 @@ void ExternalTask::start() } 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); @@ -138,3 +147,14 @@ void ExternalTask::set_stderr(Destination d) { 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(); +}