X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fexternaltask.cpp;h=f7ab199b417121712ef3d9a408a58565cc6961d8;hb=HEAD;hp=3cc8eca394572aa4b1af9b5a621fdae8c6b97238;hpb=658c46ea8ef6d7022cb8c8e06565ebce12842d0b;p=builder.git diff --git a/source/externaltask.cpp b/source/externaltask.cpp deleted file mode 100644 index 3cc8eca..0000000 --- a/source/externaltask.cpp +++ /dev/null @@ -1,148 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include "externaltask.h" - -using namespace std; -using namespace Msp; - -ExternalTask::ExternalTask(const Arguments &a, const FS::Path &wd): - argv(a), - work_dir(wd), - process(0), - exit_code(-1), - stdout_dest(PASSTHROUGH), - stderr_dest(PASSTHROUGH), - capture_pipe(0) -{ - if(argv.empty()) - throw invalid_argument("ExternalTask::ExternalTask"); -} - -ExternalTask::~ExternalTask() -{ - delete capture_pipe; -} - -string ExternalTask::get_command() const -{ - string cmd; - for(vector::const_iterator i=argv.begin(); i!=argv.end(); ++i) - { - if(i!=argv.begin()) - cmd += ' '; - - for(string::const_iterator j=i->begin(); j!=i->end(); ++j) - { - if(*j=='"' || *j=='\'' || *j==' ' || *j=='\\' || *j=='&') - cmd += '\\'; - cmd += *j; - } - } - - return cmd; -} - -void ExternalTask::start() -{ - IO::File *devnull = 0; - - prepare(); - - process = new Process; - - if(stdout_dest==IGNORE || stderr_dest==IGNORE) - { - devnull = new IO::File("/dev/null", IO::M_WRITE); - if(stdout_dest==IGNORE) - process->redirect_cout(*devnull); - if(stderr_dest==IGNORE) - process->redirect_cerr(*devnull); - } - - if(stdout_dest==CAPTURE || stderr_dest==CAPTURE) - { - capture_pipe = new IO::Pipe; - if(stdout_dest==CAPTURE) - process->redirect_cout(*capture_pipe); - if(stderr_dest==CAPTURE) - process->redirect_cerr(*capture_pipe); - } - - if(!work_dir.empty()) - process->set_working_directory(work_dir); - - Process::Arguments args(argv.begin()+1, argv.end()); - process->execute(argv.front(), args); - if(capture_pipe) - capture_pipe->set_mode(IO::M_READ); - - delete devnull; -} - -Task::Status ExternalTask::check() -{ - return do_wait(false); -} - -Task::Status ExternalTask::wait() -{ - return do_wait(true); -} - -Task::Status ExternalTask::do_wait(bool block) -{ - if(process) - { - if(process->wait(block)) - { - exit_code = process->get_exit_code(); - delete process; - process = 0; - } - - // Do this after waiting to avoid a race condition - while(capture_pipe && IO::poll(*capture_pipe, IO::P_INPUT, Time::zero)) - { - char buf[1024]; - unsigned len = capture_pipe->read(buf, sizeof(buf)); - if(len) - output.append(buf, len); - else - break; - } - - if(process) - return RUNNING; - else - signal_finished.emit(!exit_code); - } - - return exit_code ? ERROR : SUCCESS; -} - -void ExternalTask::set_stdout(Destination d) -{ - stdout_dest = d; -} - -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(); -}