X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libtest%2Fcmdline.cc;h=6b8205cb1fff276fe8d02ccb172fd123e4329541;hb=7933fa8f9217d7e744876773a4033b3cda4c3c16;hp=f6d1e3d65fae37624b283e4f5f4d2598bd18ac0f;hpb=e62187d9544abeffaa8552742da6c154fb77cf7c;p=m6w6%2Flibmemcached diff --git a/libtest/cmdline.cc b/libtest/cmdline.cc index f6d1e3d6..6b8205cb 100644 --- a/libtest/cmdline.cc +++ b/libtest/cmdline.cc @@ -36,6 +36,11 @@ using namespace libtest; #include #include #include +#include + +#ifndef __USE_GNU +static char **environ= NULL; +#endif extern "C" { static int exited_successfully(int status) @@ -107,6 +112,8 @@ Application::Application(const std::string& arg, const bool _use_libtool_arg) : _use_libtool(_use_libtool_arg), _use_valgrind(false), _use_gdb(false), + _use_ptrcheck(false), + _will_fail(false), _argc(0), _exectuble(arg), stdin_fd(STDIN_FILENO), @@ -209,7 +216,7 @@ Application::error_t Application::run(const char *args[]) const_cast(_exectuble_with_path.c_str()), 0}; - spawn_ret= posix_spawnp(&_pid, libtool(), &file_actions, &spawnattr, argv, NULL); + spawn_ret= posix_spawnp(&_pid, libtool(), &file_actions, &spawnattr, argv, environ); } else { @@ -222,7 +229,7 @@ Application::error_t Application::run(const char *args[]) const_cast(gdb_run_file.c_str()), const_cast(_exectuble_with_path.c_str()), 0}; - spawn_ret= posix_spawnp(&_pid, "gdb", &file_actions, &spawnattr, argv, NULL); + spawn_ret= posix_spawnp(&_pid, "gdb", &file_actions, &spawnattr, argv, environ); } } else @@ -244,8 +251,12 @@ Application::error_t Application::run(const char *args[]) stdout_fd.close(Application::Pipe::WRITE); stderr_fd.close(Application::Pipe::WRITE); - if (spawn_ret) + if (spawn_ret != 0) { + if (_will_fail == false) + { + Error << strerror(spawn_ret) << "(" << spawn_ret << ")"; + } _pid= -1; return Application::INVALID; } @@ -531,7 +542,7 @@ void Application::Pipe::reset() close(READ); close(WRITE); -#if _GNU_SOURCE +#if HAVE_PIPE2 if (pipe2(_pipe_fd, O_NONBLOCK) == -1) #else if (pipe(_pipe_fd) == -1) @@ -618,11 +629,18 @@ void Application::create_argv(const char *args[]) _argc+= 1; // For the command /* - valgrind --error-exitcode=1 --leak-check=yes --show-reachable=yes --track-fds=yes --malloc-fill=A5 --free-fill=DE + valgrind --error-exitcode=1 --leak-check=yes --show-reachable=yes --track-fds=yes --track-origin=yes --malloc-fill=A5 --free-fill=DE --log-file= */ if (_use_valgrind) { - _argc+= 7; + _argc+= 8; + } + else if (_use_ptrcheck) + { + /* + valgrind --error-exitcode=1 --tool=exp-ptrcheck --log-file= + */ + _argc+= 4; } else if (_use_gdb) // gdb { @@ -668,8 +686,32 @@ void Application::create_argv(const char *args[]) built_argv[x++]= strdup("--leak-check=yes"); built_argv[x++]= strdup("--show-reachable=yes"); built_argv[x++]= strdup("--track-fds=yes"); +#if 0 + built_argv[x++]= strdup("--track-origin=yes"); +#endif built_argv[x++]= strdup("--malloc-fill=A5"); built_argv[x++]= strdup("--free-fill=DE"); + + std::string log_file= create_tmpfile("valgrind"); + char buffer[1024]; + int length= snprintf(buffer, sizeof(buffer), "--log-file=%s", log_file.c_str()); + fatal_assert(length > 0 and length < sizeof(buffer)); + built_argv[x++]= strdup(buffer); + } + else if (_use_ptrcheck) + { + /* + valgrind --error-exitcode=1 --tool=exp-ptrcheck --log-file= + */ + built_argv[x++]= strdup("valgrind"); + built_argv[x++]= strdup("--error-exitcode=1"); + built_argv[x++]= strdup("--tool=exp-ptrcheck"); + _argc+= 4; + std::string log_file= create_tmpfile("ptrcheck"); + char buffer[1024]; + int length= snprintf(buffer, sizeof(buffer), "--log-file=%s", log_file.c_str()); + fatal_assert(length > 0 and length < sizeof(buffer)); + built_argv[x++]= strdup(buffer); } else if (_use_gdb) { @@ -754,4 +796,9 @@ const char *gearmand_binary() return GEARMAND_BINARY; } +const char *drizzled_binary() +{ + return DRIZZLED_BINARY; +} + } // namespace exec_cmdline