X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fexternalaction.cpp;h=cad9ba8b23d659e3be069ce1dd7eee57c0c4e5df;hb=43bd25ffcb0b4f7882773f4676b209a99cb73c04;hp=14657a04ab2c05cfa71d059be4b6c1bbad75a7ca;hpb=bdc8b6638b486aa668b4a9c6c5cce5f6b5f18222;p=builder.git diff --git a/source/externalaction.cpp b/source/externalaction.cpp index 14657a0..cad9ba8 100644 --- a/source/externalaction.cpp +++ b/source/externalaction.cpp @@ -1,21 +1,45 @@ -/* $Id$ - -This file is part of builder -Copyright © 2006-2007 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - -#include -#include #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()) @@ -32,53 +56,12 @@ int ExternalAction::check() { signal_done.emit(); if(WIFEXITED(status)) - exit_code=WEXITSTATUS(status); + exit_code = WEXITSTATUS(status); else - exit_code=254; - pid=0; + 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(StringList::const_iterator i=argv.begin(); i!=argv.end(); ++i) - { - if(i!=argv.begin()) - cout<<' '; - cout<<*i; - } - cout<<'\n'; - } - - 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()) - chdir(work_dir); - execvp(argv_[0], argv_); - cout<<"Couldn't execute "<