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