4 #include <msp/fs/dir.h>
5 #include <msp/io/print.h>
6 #include "externaltask.h"
11 ExternalTask::ExternalTask(const vector<string> &a, const FS::Path &wd):
18 string ExternalTask::get_command() const
21 for(vector<string>::const_iterator i=argv.begin(); i!=argv.end(); ++i)
26 for(string::const_iterator j=i->begin(); j!=i->end(); ++j)
28 if(*j=='"' || *j=='\'' || *j==' ' || *j=='\\' || *j=='&')
37 void ExternalTask::start()
48 vector<const char *> cargv(argv.size()+1);
49 for(unsigned i=0; i<argv.size(); ++i)
50 cargv[i] = argv[i].c_str();
55 execvp(cargv.front(), const_cast<char *const *>(&cargv.front()));
56 IO::print("Couldn't execute %s\n", argv.front());
61 Task::Status ExternalTask::check()
66 if(waitpid(pid, &status, WNOHANG)==pid)
69 exit_code = WEXITSTATUS(status);
70 else if(WIFSIGNALED(status))
71 exit_code = 256+WTERMSIG(status);
76 signal_finished.emit(!exit_code);
82 return exit_code ? ERROR : SUCCESS;