X-Git-Url: http://git.iain.cx/?a=blobdiff_plain;f=env.cpp;h=a1ca9004e29274ed5e4ed4d16df7f121259de724;hb=095331018c46d251f6db151572bb1c2e76e911fa;hp=76c187e34d113744663495afe96c93dd9bab498f;hpb=5380a4a53d9b34d6c56ef3e8a022fcdc184593a3;p=nssm.git diff --git a/env.cpp b/env.cpp index 76c187e..a1ca900 100644 --- a/env.cpp +++ b/env.cpp @@ -1,5 +1,23 @@ #include "nssm.h" +/* Copy an environment block. */ +TCHAR *copy_environment_block(TCHAR *env) { + unsigned long len; + + if (! env) return 0; + for (len = 0; env[len]; len++) while (env[len]) len++; + if (! len++) return 0; + + TCHAR *newenv = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, len * sizeof(TCHAR)); + if (! newenv) { + log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, _T("environment"), _T("copy_environment_block()"), 0); + return 0; + } + + memmove(newenv, env, len * sizeof(TCHAR)); + return newenv; +} + /* The environment block starts with variables of the form =C:=C:\Windows\System32 which we ignore. @@ -68,7 +86,7 @@ static int set_environment_block(TCHAR *env, bool set) { else { if (! SetEnvironmentVariable(s, NULL)) ret++; } - for (t++ ; *t; t++); + for (t++; *t; t++); } s = t; } @@ -111,8 +129,7 @@ int duplicate_environment(TCHAR *rawenv) { -1 on error. */ int test_environment(TCHAR *env) { - TCHAR path[PATH_LENGTH]; - GetModuleFileName(0, path, _countof(path)); + TCHAR *path = (TCHAR *) nssm_imagepath(); STARTUPINFO si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); @@ -139,3 +156,26 @@ int test_environment(TCHAR *env) { return 0; } + +/* + Duplicate an environment block returned by GetEnvironmentStrings(). + Since such a block is by definition readonly, and duplicate_environment() + modifies its inputs, this function takes a copy of the input and operates + on that. +*/ +void duplicate_environment_strings(TCHAR *env) { + TCHAR *newenv = copy_environment_block(env); + if (! newenv) return; + + duplicate_environment(newenv); + HeapFree(GetProcessHeap(), 0, newenv); +} + +/* Safely get a copy of the current environment. */ +TCHAR *copy_environment() { + TCHAR *rawenv = GetEnvironmentStrings(); + if (! rawenv) return NULL; + TCHAR *env = copy_environment_block(rawenv); + FreeEnvironmentStrings(rawenv); + return env; +}