]> git.tdb.fi Git - builder.git/blob - source/externalaction.cpp
7e0a23de5021bcd7f3211fe201e7f85169727106
[builder.git] / source / externalaction.cpp
1 /* $Id$
2
3 This file is part of builder
4 Copyright © 2006-2009  Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
6 */
7
8 #include <cstring>
9 #include <cstdlib>
10 #include <sys/wait.h>
11 #include <msp/fs/dir.h>
12 #include <msp/io/print.h>
13 #include <msp/strings/utils.h>
14 #include "builder.h"
15 #include "externalaction.h"
16
17 using namespace std;
18 using namespace Msp;
19
20 void ExternalAction::launch()
21 {
22         if(builder.get_verbose()>=2)
23                 IO::print("%s\n", join(argv.begin(), argv.end()));
24
25         if(builder.get_dry_run())
26                 pid=-1;
27         else
28         {
29                 pid=fork();
30                 if(pid==0)
31                 {
32                         char *argv_[argv.size()+1];
33
34                         unsigned j=0;
35                         for(StringList::iterator i=argv.begin(); i!=argv.end(); ++i)
36                                 argv_[j++]=strdup(i->c_str());
37                         argv_[j]=0;
38
39                         if(!work_dir.empty())
40                                 FS::chdir(work_dir);
41                         execvp(argv_[0], argv_);
42                         IO::print("Couldn't execute %s\n", argv.front());
43                         exit(1);
44                 }
45                 else if(pid<0)
46                         pid=0;
47         }
48 }
49
50 int ExternalAction::check()
51 {
52         if(builder.get_dry_run())
53         {
54                 signal_done.emit();
55                 return 0;
56         }
57
58         if(!pid)
59                 return exit_code;
60
61         int status;
62         if(waitpid(pid, &status, WNOHANG)==pid)
63         {
64                 signal_done.emit();
65                 if(WIFEXITED(status))
66                         exit_code=WEXITSTATUS(status);
67                 else
68                         exit_code=254;
69                 pid=0;
70                 return exit_code;
71         }
72         else
73                 return -1;
74 }