| Index: base/process/launch_posix.cc
|
| diff --git a/base/process/launch_posix.cc b/base/process/launch_posix.cc
|
| index 99d8e3aa64da8963aa212542bb7871d3a6c642d7..0ebf984f5ae150638c93aa2892a26b26ebbf9d23 100644
|
| --- a/base/process/launch_posix.cc
|
| +++ b/base/process/launch_posix.cc
|
| @@ -530,7 +530,8 @@ enum GetAppOutputInternalResult {
|
| // path for the application; in that case, |envp| must be null, and it will use
|
| // the current environment. If |do_search_path| is false, |argv[0]| should fully
|
| // specify the path of the application, and |envp| will be used as the
|
| -// environment. Redirects stderr to /dev/null.
|
| +// environment. If |include_stderr| is true, includes stderr otherwise redirects
|
| +// it to /dev/null.
|
| // If we successfully start the application and get all requested output, we
|
| // return GOT_MAX_OUTPUT, or if there is a problem starting or exiting
|
| // the application we return RUN_FAILURE. Otherwise we return EXECUTE_SUCCESS.
|
| @@ -543,6 +544,7 @@ enum GetAppOutputInternalResult {
|
| static GetAppOutputInternalResult GetAppOutputInternal(
|
| const std::vector<std::string>& argv,
|
| char* const envp[],
|
| + bool include_stderr,
|
| std::string* output,
|
| size_t max_output,
|
| bool do_search_path,
|
| @@ -597,7 +599,9 @@ static GetAppOutputInternalResult GetAppOutputInternal(
|
| base::type_profiler::Controller::Stop();
|
|
|
| fd_shuffle1.push_back(InjectionArc(pipe_fd[1], STDOUT_FILENO, true));
|
| - fd_shuffle1.push_back(InjectionArc(dev_null, STDERR_FILENO, true));
|
| + fd_shuffle1.push_back(InjectionArc(
|
| + include_stderr ? pipe_fd[1] : dev_null,
|
| + STDERR_FILENO, true));
|
| fd_shuffle1.push_back(InjectionArc(dev_null, STDIN_FILENO, true));
|
| // Adding another element here? Remeber to increase the argument to
|
| // reserve(), above.
|
| @@ -666,11 +670,20 @@ bool GetAppOutput(const std::vector<std::string>& argv, std::string* output) {
|
| // Run |execve()| with the current environment and store "unlimited" data.
|
| int exit_code;
|
| GetAppOutputInternalResult result = GetAppOutputInternal(
|
| - argv, NULL, output, std::numeric_limits<std::size_t>::max(), true,
|
| + argv, NULL, false, output, std::numeric_limits<std::size_t>::max(), true,
|
| &exit_code);
|
| return result == EXECUTE_SUCCESS && exit_code == EXIT_SUCCESS;
|
| }
|
|
|
| +bool GetAppOutputAndError(const CommandLine& cl, std::string* output) {
|
| + // Run |execve()| with the current environment and store "unlimited" data.
|
| + int exit_code;
|
| + GetAppOutputInternalResult result = GetAppOutputInternal(
|
| + cl.argv(), NULL, true, output, std::numeric_limits<std::size_t>::max(),
|
| + true, &exit_code);
|
| + return result == EXECUTE_SUCCESS && exit_code == EXIT_SUCCESS;
|
| +}
|
| +
|
| // TODO(viettrungluu): Conceivably, we should have a timeout as well, so we
|
| // don't hang if what we're calling hangs.
|
| bool GetAppOutputRestricted(const CommandLine& cl,
|
| @@ -679,7 +692,7 @@ bool GetAppOutputRestricted(const CommandLine& cl,
|
| char* const empty_environ = NULL;
|
| int exit_code;
|
| GetAppOutputInternalResult result = GetAppOutputInternal(
|
| - cl.argv(), &empty_environ, output, max_output, false, &exit_code);
|
| + cl.argv(), &empty_environ, false, output, max_output, false, &exit_code);
|
| return result == GOT_MAX_OUTPUT || (result == EXECUTE_SUCCESS &&
|
| exit_code == EXIT_SUCCESS);
|
| }
|
| @@ -689,8 +702,8 @@ bool GetAppOutputWithExitCode(const CommandLine& cl,
|
| int* exit_code) {
|
| // Run |execve()| with the current environment and store "unlimited" data.
|
| GetAppOutputInternalResult result = GetAppOutputInternal(
|
| - cl.argv(), NULL, output, std::numeric_limits<std::size_t>::max(), true,
|
| - exit_code);
|
| + cl.argv(), NULL, false, output, std::numeric_limits<std::size_t>::max(),
|
| + true, exit_code);
|
| return result == EXECUTE_SUCCESS;
|
| }
|
|
|
|
|