X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Fexternalaction.cpp;h=88c7e544e7907671daa82a6d8381f29f46257356;hb=242c55b17e6608b29a77ca17a5b677e202a3ca90;hp=81d28b37a6a7398fd0b186256c328a912ae87168;hpb=97001ddfa2463e6a3526eff772962acdad45f995;p=builder.git diff --git a/source/externalaction.cpp b/source/externalaction.cpp index 81d28b3..88c7e54 100644 --- a/source/externalaction.cpp +++ b/source/externalaction.cpp @@ -1,34 +1,26 @@ +/* $Id$ + +This file is part of builder +Copyright © 2006-2009 Mikko Rasa, Mikkosoft Productions +Distributed under the LGPL +*/ + #include -#include +#include +#include +#include +#include #include "builder.h" #include "externalaction.h" using namespace std; using namespace Msp; -int ExternalAction::check() -{ - if(!pid) - return 255; - - int status; - if(waitpid(pid, &status, WNOHANG)==pid) - { - signal_done.emit(); - if(WIFEXITED(status)) - return WEXITSTATUS(status); - else - return 254; - } - else - return -1; -} - void ExternalAction::launch() { if(builder.get_verbose()>=2) { - for(list::const_iterator i=argv.begin(); i!=argv.end(); ++i) + for(StringList::const_iterator i=argv.begin(); i!=argv.end(); ++i) { if(i!=argv.begin()) cout<<' '; @@ -36,17 +28,54 @@ void ExternalAction::launch() } cout<<'\n'; } - - pid=fork(); - if(pid==0) + + 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_); + cout<<"Couldn't execute "<::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); + signal_done.emit(); + return 0; } - else if(pid<0) + + if(!pid) + return exit_code; + + int status; + if(waitpid(pid, &status, WNOHANG)==pid) + { + signal_done.emit(); + if(WIFEXITED(status)) + exit_code=WEXITSTATUS(status); + else + exit_code=254; pid=0; + return exit_code; + } + else + return -1; }