#include <string>
#include <sys/stat.h>
#include <sys/types.h>
+#include <unistd.h>
+
+#ifndef __USE_GNU
+static char **environ= NULL;
+#endif
extern "C" {
static int exited_successfully(int status)
_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),
const_cast<char *>(_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
{
const_cast<char *>(gdb_run_file.c_str()),
const_cast<char *>(_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
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;
}
close(READ);
close(WRITE);
-#if _GNU_SOURCE
+#if HAVE_PIPE2
if (pipe2(_pipe_fd, O_NONBLOCK) == -1)
#else
if (pipe(_pipe_fd) == -1)
_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
{
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)
{
return GEARMAND_BINARY;
}
+const char *drizzled_binary()
+{
+ return DRIZZLED_BINARY;
+}
+
} // namespace exec_cmdline