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
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
);