1 /*-------------------------------------------------------------------------
4 * putenv() and unsetenv() for win32, that updates both process
5 * environment and the cached versions in (potentially multiple)
8 * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
9 * Portions Copyright (c) 1994, Regents of the University of California
13 * $PostgreSQL: pgsql/src/port/win32env.c,v 1.3 2009/06/11 14:49:15 momjian Exp $
15 *-------------------------------------------------------------------------
21 pgwin32_putenv(const char *envval)
27 * Each version of MSVCRT has its own _putenv() call in the runtime
30 * If we're in VC 7.0 or later (means != mingw), update in the 6.0
31 * MSVCRT.DLL environment as well, to work with third party libraries
32 * linked against it (such as gnuwin32 libraries).
34 #if defined(_MSC_VER) && (_MSC_VER >= 1300)
35 typedef int (_cdecl * PUTENVPROC) (const char *);
37 static PUTENVPROC putenvFunc = NULL;
40 if (putenvFunc == NULL)
42 hmodule = GetModuleHandle("msvcrt");
45 putenvFunc = (PUTENVPROC) GetProcAddress(hmodule, "_putenv");
46 if (putenvFunc == NULL)
49 ret = putenvFunc(envval);
52 #endif /* _MSC_VER >= 1300 */
56 * Update the process environment - to make modifications visible to child
59 * Need a copy of the string so we can modify it.
61 envcpy = strdup(envval);
62 cp = strchr(envcpy, '=');
70 * Only call SetEnvironmentVariable() when we are adding a variable,
71 * not when removing it. Calling it on both crashes on at least
72 * certain versions of MingW.
74 if (!SetEnvironmentVariable(envcpy, cp))
82 /* Finally, update our "own" cache */
83 return _putenv(envval);
87 pgwin32_unsetenv(const char *name)
91 envbuf = (char *) malloc(strlen(name) + 2);
95 sprintf(envbuf, "%s=", name);
96 pgwin32_putenv(envbuf);