From fc0aa1b0915a65f8968e965eda3172ab3cd3c5f1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Wed, 12 Jun 2013 23:28:42 +0100 Subject: [PATCH] cli: Don't replace, but instead prepend the environment variable. --- cli/cli_trace.cpp | 62 ++++++++++++++++++++++++++++---------------- common/os_string.hpp | 2 ++ 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/cli/cli_trace.cpp b/cli/cli_trace.cpp index 52843c7..5903bdc 100644 --- a/cli/cli_trace.cpp +++ b/cli/cli_trace.cpp @@ -154,39 +154,57 @@ traceProgram(trace::API api, wrapperPath.trimFilename(); #endif + /* + * Spawn child process. + */ + + { #if defined(TRACE_VARIABLE) - if (verbose) { - std::cerr << TRACE_VARIABLE << "=" << wrapperPath.str() << "\n"; - } - /* FIXME: Don't modify the current environment */ - os::setEnvironment(TRACE_VARIABLE, wrapperPath.str()); + const char *oldEnvVarValue = getenv(TRACE_VARIABLE); + if (oldEnvVarValue) { + wrapperPath.append(OS_PATH_SEP); + wrapperPath.append(oldEnvVarValue); + } + + /* FIXME: Don't modify our (ie parent) environment */ + os::setEnvironment(TRACE_VARIABLE, wrapperPath.str()); + + if (verbose) { + std::cerr << TRACE_VARIABLE << "=" << wrapperPath.str() << "\n"; + } #endif /* TRACE_VARIABLE */ - if (output) { - os::setEnvironment("TRACE_FILE", output); - } + if (output) { + os::setEnvironment("TRACE_FILE", output); + } - for (char * const * arg = argv; *arg; ++arg) { - args.push_back(*arg); - } + for (char * const * arg = argv; *arg; ++arg) { + args.push_back(*arg); + } - if (verbose) { - const char *sep = ""; - for (unsigned i = 0; i < args.size(); ++i) { - std::cerr << sep << args[i]; - sep = " "; + if (verbose) { + const char *sep = ""; + for (unsigned i = 0; i < args.size(); ++i) { + std::cerr << sep << args[i]; + sep = " "; + } + std::cerr << "\n"; } - std::cerr << "\n"; - } - args.push_back(NULL); + args.push_back(NULL); - status = os::execute((char * const *)&args[0]); + status = os::execute((char * const *)&args[0]); -exit: #if defined(TRACE_VARIABLE) - os::unsetEnvironment(TRACE_VARIABLE); + if (oldEnvVarValue) { + os::setEnvironment(TRACE_VARIABLE, oldEnvVarValue); + } else { + os::unsetEnvironment(TRACE_VARIABLE); + } #endif + } + +exit: #if defined(_WIN32) if (!useInject) { os::String tmpWrapper(argv[0]); diff --git a/common/os_string.hpp b/common/os_string.hpp index 3a8eab6..35156a1 100644 --- a/common/os_string.hpp +++ b/common/os_string.hpp @@ -57,8 +57,10 @@ extern "C" _CRTIMP int _vscprintf(const char *format, va_list argptr); #ifdef _WIN32 #define OS_DIR_SEP '\\' +#define OS_PATH_SEP ';' #else /* !_WIN32 */ #define OS_DIR_SEP '/' +#define OS_PATH_SEP ':' #endif /* !_WIN32 */ -- 2.43.0