[PATCH xorg-gtest 4/4] process: add Start(program, vector<char*>)
Chase Douglas
chase.douglas at canonical.com
Wed Jul 11 12:29:34 PDT 2012
On 07/10/2012 06:51 PM, Peter Hutterer wrote:
> Same thing as the va_list but takes a std::vector of arguments instead.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> include/xorg/gtest/xorg-gtest-process.h | 16 ++++++++++++++++
> src/process.cpp | 25 +++++++++++++++++++------
> 2 files changed, 35 insertions(+), 6 deletions(-)
>
> diff --git a/include/xorg/gtest/xorg-gtest-process.h b/include/xorg/gtest/xorg-gtest-process.h
> index 47aefcf..0b721ce 100644
> --- a/include/xorg/gtest/xorg-gtest-process.h
> +++ b/include/xorg/gtest/xorg-gtest-process.h
> @@ -93,6 +93,22 @@ class Process {
> /**
> * Starts a program as a child process.
> *
> + * See 'man execvp' for further information on the elements in
> + * the vector.
> + *
> + * @param program The program to start.
> + * @param args Vector of arguments passed to the program.
> + *
> + * @throws std::runtime_error on failure.
> + *
> + * @post If successful: Child process forked and program started.
> + * @post If successful: Subsequent calls to Pid() return child process pid.
> + */
> + void Start(const std::string& program, const std::vector<std::string> &args);
> +
> + /**
> + * Starts a program as a child process.
> + *
> * See 'man execvp' for further information on the variadic argument list.
> *
> * @param program The program to start.
> diff --git a/src/process.cpp b/src/process.cpp
> index e79b694..7b60afc 100644
> --- a/src/process.cpp
> +++ b/src/process.cpp
> @@ -48,7 +48,7 @@ xorg::testing::Process::Process() : d_(new Private) {
> d_->pid = -1;
> }
>
> -void xorg::testing::Process::Start(const std::string& program, va_list args) {
> +void xorg::testing::Process::Start(const std::string &program, const std::vector<std::string> &argv) {
> if (d_->pid != -1)
> throw std::runtime_error("Attempting to start an already started process");
>
> @@ -61,18 +61,31 @@ void xorg::testing::Process::Start(const std::string& program, va_list args) {
> close(1);
> close(2);
>
> - std::vector<char*> argv;
> + std::vector<char*> args;
> + std::vector<std::string>::const_iterator it;
>
> - do
> - argv.push_back(va_arg(args, char*));
> - while (argv.back());
> + for (it = argv.begin(); it != argv.end(); it++)
> + if (!it->empty())
> + args.push_back(strdup(it->c_str()));
> + args.push_back(NULL);
>
> - execvp(program.c_str(), &argv[0]);
> + execvp(program.c_str(), &args[0]);
>
> throw std::runtime_error("Failed to start process");
> }
> }
>
> +void xorg::testing::Process::Start(const std::string& program, va_list args) {
> + std::vector<std::string> argv;
> +
> + do {
> + std::string arg(va_arg(args, char*));
> + argv.push_back(arg);
> + } while (!argv.back().empty());
> +
> + Start(program, argv);
> +}
> +
> void xorg::testing::Process::Start(const std::string& program, ...) {
> va_list list;
> va_start(list, program);
>
Works for me :).
Reviewed-by: Chase Douglas <chase.douglas at canonical.com>
More information about the xorg-devel
mailing list