24 #include <sys/types.h> 37 std::string shell=
"/bin/sh";
38 std::vector<std::string> argv;
39 argv.push_back(shell);
40 argv.push_back(command);
41 return run(shell, argv,
"",
"",
"");
53 int flags = 0, mode = 0;
65 flags = O_CREAT | O_WRONLY;
66 mode = S_IRUSR | S_IWUSR;
67 name = fd == STDOUT_FILENO ?
"stdout" :
"stderr";
74 result_fd = open(
file.c_str(), flags, mode);
76 perror((
"Failed to open " + name +
" file " +
file).c_str());
83 const std::string &what,
84 const std::vector<std::string> &argv,
85 const std::string &std_input,
86 const std::string &std_output,
87 const std::string &std_error)
96 std::vector<std::wstring> wargv;
98 wargv.resize(argv.size());
100 for(std::size_t i=0; i<argv.size(); i++)
101 wargv[i]=
widen(argv[i]);
103 std::vector<const wchar_t *> _argv(argv.size()+1);
105 for(std::size_t i=0; i<wargv.size(); i++)
106 _argv[i]=wargv[i].c_str();
108 _argv[argv.size()]=NULL;
112 std::wstring wide_what=
widen(what);
114 int status=_wspawnvp(_P_WAIT, wide_what.c_str(), _argv.data());
123 if(stdin_fd == -1 || stdout_fd == -1 || stderr_fd == -1)
127 sigset_t new_mask, old_mask;
128 sigemptyset(&new_mask);
129 sigprocmask(SIG_SETMASK, &new_mask, &old_mask);
132 pid_t childpid = fork();
140 sigprocmask(SIG_SETMASK, &old_mask,
nullptr);
142 std::vector<char *> _argv(argv.size()+1);
143 for(std::size_t i=0; i<argv.size(); i++)
144 _argv[i]=strdup(argv[i].c_str());
146 _argv[argv.size()]=
nullptr;
148 if(stdin_fd!=STDIN_FILENO)
149 dup2(stdin_fd, STDIN_FILENO);
150 if(stdout_fd!=STDOUT_FILENO)
151 dup2(stdout_fd, STDOUT_FILENO);
152 if(stderr_fd != STDERR_FILENO)
153 dup2(stderr_fd, STDERR_FILENO);
156 execvp(what.c_str(), _argv.data());
159 perror(std::string(
"execvp "+what+
" failed").c_str());
165 sigprocmask(SIG_SETMASK, &old_mask,
nullptr);
170 while(waitpid(childpid, &status, 0)==-1)
175 perror(
"Waiting for child process failed");
176 if(stdin_fd!=STDIN_FILENO)
178 if(stdout_fd!=STDOUT_FILENO)
180 if(stderr_fd != STDERR_FILENO)
185 if(stdin_fd!=STDIN_FILENO)
187 if(stdout_fd!=STDOUT_FILENO)
189 if(stderr_fd != STDERR_FILENO)
192 return WEXITSTATUS(status);
198 sigprocmask(SIG_SETMASK, &old_mask,
nullptr);
200 if(stdin_fd!=STDIN_FILENO)
202 if(stdout_fd!=STDOUT_FILENO)
204 if(stderr_fd != STDERR_FILENO)
std::wstring widen(const char *s)
int run(const std::string &what, const std::vector< std::string > &argv, const std::string &std_input, const std::string &std_output, const std::string &std_error)
void remove_signal_catcher()
int run_shell(const std::string &command)
#define PRECONDITION(CONDITION)
static int stdio_redirection(int fd, const std::string &file)
open given file to replace either stdin, stderr, stdout