]> git.tdb.fi Git - builder.git/blob - source/externaltask.cpp
Don't start tasks automatically upon creation
[builder.git] / source / externaltask.cpp
1 #include <cstdlib>
2 #include <unistd.h>
3 #include <sys/wait.h>
4 #include <msp/fs/dir.h>
5 #include <msp/io/print.h>
6 #include "externaltask.h"
7
8 using namespace std;
9 using namespace Msp;
10
11 ExternalTask::ExternalTask(const vector<string> &argv, const FS::Path &work_dir):
12         pid(-1),
13         exit_code(-1)
14 { }
15
16 void ExternalTask::start()
17 {
18         if((pid = fork()))
19         {
20                 if(pid==-1)
21                         exit_code = 1;
22                 else
23                         exit_code = 0;
24         }
25         else
26         {
27                 vector<const char *> cargv(argv.size()+1);
28                 for(unsigned i=0; i<argv.size(); ++i)
29                         cargv[i] = argv[i].c_str();
30                 cargv.back() = 0;
31
32                 if(!work_dir.empty())
33                         FS::chdir(work_dir);
34                 execvp(cargv.front(), const_cast<char *const *>(&cargv.front()));
35                 IO::print("Couldn't execute %s\n", argv.front());
36                 exit(1);
37         }
38 }
39
40 Task::Status ExternalTask::check()
41 {
42         if(pid>0)
43         {
44                 int status;
45                 if(waitpid(pid, &status, WNOHANG)==pid)
46                 {
47                         if(WIFEXITED(status))
48                                 exit_code = WEXITSTATUS(status);
49                         else if(WIFSIGNALED(status))
50                                 exit_code = 256+WTERMSIG(status);
51                         else
52                                 exit_code = 1025;
53                         pid = 0;
54
55                         signal_finished.emit(!exit_code);
56                 }
57                 else
58                         return RUNNING;
59         }
60
61         return exit_code ? ERROR : SUCCESS;
62 }