From fa5bddc1543df8ef4423f99e8ee8cc2715cb6cba Mon Sep 17 00:00:00 2001 From: Hexchain Tong Date: Wed, 9 Jul 2014 18:14:52 +0800 Subject: [PATCH] Preserve old environment variable values when preloading --- src/main.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index a3378d5..ca1dc9f 100644 --- a/src/main.c +++ b/src/main.c @@ -55,6 +55,25 @@ static void set_own_dir(const char *argv0) { } } +static int putenv_prepend(char* string) { + char *value; + char *vbuf = NULL; + size_t length; + + char orig[256]; + + strncpy(orig, string, sizeof(orig)); + value = getenv(strtok(orig, "=")); + + if(NULL == value) + return putenv(string); + + length = strlen(string) + strlen(value) + 2; // separator and trailing \0 + vbuf = (char*) calloc(length, sizeof(char)); + snprintf(vbuf, length, "%s:%s", string, value); + return putenv(vbuf); +} + #define MAX_COMMANDLINE_FLAGS 2 int main(int argc, char *argv[]) { @@ -124,10 +143,10 @@ int main(int argc, char *argv[]) { #ifndef IS_MAC snprintf(buf, sizeof(buf), "LD_PRELOAD=%s/%s", prefix, dll_name); - putenv(buf); + putenv_prepend(buf); #else snprintf(buf, sizeof(buf), "DYLD_INSERT_LIBRARIES=%s/%s", prefix, dll_name); - putenv(buf); + putenv_prepend(buf); putenv("DYLD_FORCE_FLAT_NAMESPACE=1"); #endif execvp(argv[start_argv], &argv[start_argv]);