X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fexternalaction.cpp;h=cad9ba8b23d659e3be069ce1dd7eee57c0c4e5df;hb=43bd25ffcb0b4f7882773f4676b209a99cb73c04;hp=d4a48d730513d401738f8e6ba65d4e15739dc439;hpb=59ac0a44d6edf179c01604c6ced744873213f855;p=builder.git diff --git a/source/externalaction.cpp b/source/externalaction.cpp index d4a48d7..cad9ba8 100644 --- a/source/externalaction.cpp +++ b/source/externalaction.cpp @@ -1,52 +1,67 @@ +#include +#include #include -#include +#include +#include +#include #include "builder.h" #include "externalaction.h" using namespace std; using namespace Msp; +void ExternalAction::launch() +{ + if(builder.get_verbose()>=2) + IO::print("%s\n", join(argv.begin(), argv.end())); + + if(builder.get_dry_run()) + pid = -1; + else + { + pid = fork(); + if(pid==0) + { + char *argv_[argv.size()+1]; + + unsigned j = 0; + for(StringList::iterator i=argv.begin(); i!=argv.end(); ++i) + argv_[j++] = strdup(i->c_str()); + argv_[j] = 0; + + if(!work_dir.empty()) + FS::chdir(work_dir); + execvp(argv_[0], argv_); + IO::print("Couldn't execute %s\n", argv.front()); + exit(1); + } + else if(pid<0) + pid = 0; + } +} + int ExternalAction::check() { + if(builder.get_dry_run()) + { + signal_done.emit(); + return 0; + } + if(!pid) - return 255; + return exit_code; int status; if(waitpid(pid, &status, WNOHANG)==pid) { signal_done.emit(); if(WIFEXITED(status)) - return WEXITSTATUS(status); + exit_code = WEXITSTATUS(status); else - return 254; + exit_code = 254; + pid = 0; + return exit_code; } else return -1; } - -void ExternalAction::launch() -{ - if(builder.get_verbose()>=1) - { - for(list::const_iterator i=argv.begin(); i!=argv.end(); ++i) - { - if(i!=argv.begin()) - cout<<' '; - cout<<*i; - } - cout<<'\n'; - } - - pid=fork(); - if(pid==0) - { - char *argv_[argv.size()+1]; - for(CountingIterator::iterator> i=argv.begin(); i!=argv.end(); ++i) - argv_[i.count()]=strdup(i->c_str()); - argv_[argv.size()]=0; - execvp(argv_[0], argv_); - exit(1); - } - else if(pid<0) - pid=0; -}