]> git.tdb.fi Git - builder.git/blob - source/externalaction.cpp
Move class PackageRef to its own files
[builder.git] / source / externalaction.cpp
1 #include <sys/wait.h>
2 #include <msp/iter.h>
3 #include "builder.h"
4 #include "externalaction.h"
5
6 using namespace std;
7 using namespace Msp;
8
9 int ExternalAction::check()
10 {
11         if(builder.get_dry_run())
12         {
13                 signal_done.emit();
14                 return 0;
15         }
16         
17         if(!pid)
18                 return 255;
19
20         int status;
21         if(waitpid(pid, &status, WNOHANG)==pid)
22         {
23                 signal_done.emit();
24                 if(WIFEXITED(status))
25                         exit_code=WEXITSTATUS(status);
26                 else
27                         exit_code=254;
28                 return exit_code;
29         }
30         else
31                 return -1;
32 }
33
34 void ExternalAction::launch()
35 {
36         if(builder.get_verbose()>=2)
37         {
38                 for(list<string>::const_iterator i=argv.begin(); i!=argv.end(); ++i)
39                 {
40                         if(i!=argv.begin())
41                                 cout<<' ';
42                         cout<<*i;
43                 }
44                 cout<<'\n';
45         }
46         
47         if(builder.get_dry_run())
48                 pid=-1;
49         else
50         {
51                 pid=fork();
52                 if(pid==0)
53                 {
54                         char *argv_[argv.size()+1];
55                         for(CountingIterator<string, list<string>::iterator> i=argv.begin(); i!=argv.end(); ++i)
56                                 argv_[i.count()]=strdup(i->c_str());
57                         argv_[argv.size()]=0;
58                         execvp(argv_[0], argv_);
59                         exit(1);
60                 }
61                 else if(pid<0)
62                         pid=0;
63         }
64 }