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