X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fexternalaction.cpp;h=54c9acc1274fed39f2b01c79aafeabdaa8d6d4bd;hb=4c11e2a041d2064f44b7eb3dbf1976c35fc8881c;hp=81d28b37a6a7398fd0b186256c328a912ae87168;hpb=97001ddfa2463e6a3526eff772962acdad45f995;p=builder.git diff --git a/source/externalaction.cpp b/source/externalaction.cpp index 81d28b3..54c9acc 100644 --- a/source/externalaction.cpp +++ b/source/externalaction.cpp @@ -1,5 +1,13 @@ +/* $Id$ + +This file is part of builder +Copyright © 2006-2007 Mikko Rasa, Mikkosoft Productions +Distributed under the LGPL +*/ + #include -#include +#include +#include #include "builder.h" #include "externalaction.h" @@ -8,27 +16,38 @@ using namespace Msp; 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; } +/** +Starts the external program. Fill in argv before calling this. +*/ 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 +55,28 @@ void ExternalAction::launch() } cout<<'\n'; } - - pid=fork(); - if(pid==0) + + if(builder.get_dry_run()) + pid=-1; + else { - 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); + 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()) + chdir(work_dir); + execvp(argv_[0], argv_); + cout<<"Couldn't execute "<