]> git.tdb.fi Git - builder.git/blobdiff - source/externalaction.cpp
Use mspio for all I/O operations
[builder.git] / source / externalaction.cpp
index b86d8028da25636e5677f00e5eb1763df6a17a94..7e0a23de5021bcd7f3211fe201e7f85169727106 100644 (file)
@@ -1,12 +1,52 @@
+/* $Id$
+
+This file is part of builder
+Copyright © 2006-2009  Mikko Rasa, Mikkosoft Productions
+Distributed under the LGPL
+*/
+
+#include <cstring>
+#include <cstdlib>
 #include <sys/wait.h>
-#include <iostream>
-#include <msp/iter.h>
+#include <msp/fs/dir.h>
+#include <msp/io/print.h>
+#include <msp/strings/utils.h>
 #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())
@@ -14,9 +54,9 @@ int ExternalAction::check()
                signal_done.emit();
                return 0;
        }
-       
+
        if(!pid)
-               return 255;
+               return exit_code;
 
        int status;
        if(waitpid(pid, &status, WNOHANG)==pid)
@@ -26,40 +66,9 @@ int ExternalAction::check()
                        exit_code=WEXITSTATUS(status);
                else
                        exit_code=254;
+               pid=0;
                return exit_code;
        }
        else
                return -1;
 }
-
-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];
-                       for(CountingIterator<string, StringList::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;
-       }
-}