work_dir(wd),
process(0),
exit_code(-1),
+ stdin_action(PASSTHROUGH),
stdout_action(PASSTHROUGH),
stderr_action(PASSTHROUGH),
capture_pipe(0)
}
}
- if(!stdin_file.empty())
+ if(stdin_action==REDIRECT)
{
cmd += " <";
cmd += stdin_file.str();
process = new Process;
- if(stdout_action==IGNORE || stderr_action==IGNORE)
+ if(stdin_action==IGNORE || stdout_action==IGNORE || stderr_action==IGNORE)
{
- devnull = new IO::File("/dev/null", IO::M_WRITE);
+ devnull = new IO::File("/dev/null", IO::M_RDWR);
+ if(stdin_action==IGNORE)
+ process->redirect_cin(*devnull);
if(stdout_action==IGNORE)
process->redirect_cout(*devnull);
if(stderr_action==IGNORE)
process->redirect_cerr(*capture_pipe);
}
- if(!stdin_file.empty())
+ if(stdin_action==REDIRECT)
{
infile = new IO::File((work_dir/stdin_file).str());
process->redirect_cin(*infile);
void ExternalTask::set_stdin(const FS::Path &f)
{
+ stdin_action = REDIRECT;
stdin_file = f;
}
stderr_action = a;
}
-string ExternalTask::run_and_capture_output(const Arguments &argv, const FS::Path &wd)
+string ExternalTask::run_and_capture_output(const Arguments &argv, const FS::Path &wd, bool capture_stderr)
{
ExternalTask task(argv, wd);
+ task.stdin_action = IGNORE;
task.set_stdout(CAPTURE);
- task.set_stderr(IGNORE);
+ task.set_stderr(capture_stderr ? CAPTURE : IGNORE);
task.start();
if(task.wait()!=SUCCESS)
throw runtime_error(format("%s failed", argv.front()));
Msp::FS::Path work_dir;
Msp::Process *process;
int exit_code;
+ StreamAction stdin_action;
Msp::FS::Path stdin_file;
StreamAction stdout_action;
Msp::FS::Path stdout_file;
still running, but it will always return all output. */
const std::string &get_output() const { return output; }
- /** Executes a command and captures its output. Stderr is ignored, but if
- the command exits with a nonzero status, an exception is thrown. */
- static std::string run_and_capture_output(const Arguments &, const Msp::FS::Path & = Msp::FS::Path());
+ /** Executes a command and captures its output. If the command exits with
+ a nonzero status, an exception is thrown. */
+ static std::string run_and_capture_output(const Arguments &, const Msp::FS::Path & = Msp::FS::Path(), bool = false);
};
#endif