Fix xslt_process() to ensure that it inserts a NULL terminator after the
[PostgreSQL.git] / src / port / win32env.c
bloba2595a84d8b574f501088ce15a16f084c296c92c
1 /*-------------------------------------------------------------------------
3 * win32env.c
4 * putenv() and unsetenv() for win32, that updates both process
5 * environment and the cached versions in (potentially multiple)
6 * MSVCRT.
8 * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
9 * Portions Copyright (c) 1994, Regents of the University of California
12 * IDENTIFICATION
13 * $PostgreSQL$
15 *-------------------------------------------------------------------------
18 #include "c.h"
20 int
21 pgwin32_putenv(const char *envval)
23 char *envcpy;
24 char *cp;
27 * Each version of MSVCRT has its own _putenv() call in the runtime
28 * library.
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 *);
36 HMODULE hmodule;
37 static PUTENVPROC putenvFunc = NULL;
38 int ret;
40 if (putenvFunc == NULL)
42 hmodule = GetModuleHandle("msvcrt");
43 if (hmodule == NULL)
44 return 1;
45 putenvFunc = (PUTENVPROC) GetProcAddress(hmodule, "_putenv");
46 if (putenvFunc == NULL)
47 return 1;
49 ret = putenvFunc(envval);
50 if (ret != 0)
51 return ret;
52 #endif /* _MSC_VER >= 1300 */
56 * Update the process environment - to make modifications visible to child
57 * processes.
59 * Need a copy of the string so we can modify it.
61 envcpy = strdup(envval);
62 cp = strchr(envcpy, '=');
63 if (cp == NULL)
64 return -1;
65 *cp = '\0';
66 cp++;
67 if (strlen(cp))
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))
76 free(envcpy);
77 return -1;
80 free(envcpy);
82 /* Finally, update our "own" cache */
83 return _putenv(envval);
86 void
87 pgwin32_unsetenv(const char *name)
89 char *envbuf;
91 envbuf = (char *) malloc(strlen(name) + 2);
92 if (!envbuf)
93 return;
95 sprintf(envbuf, "%s=", name);
96 pgwin32_putenv(envbuf);
97 free(envbuf);