1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-02 11:44:50 +03:00
postgres/src/port/win32env.c
Magnus Hagander b31d0719fb Don't call SetEnvironmentVariable() when removing an environment variable,
as this seems to crash on at least some versions of MingW. Our current usage
of this function does not require it, so it should be ok to ignore.
2009-02-12 12:53:34 +00:00

100 lines
2.2 KiB
C

/*-------------------------------------------------------------------------
*
* win32env.c
* putenv() and unsetenv() for win32, that updates both process
* environment and the cached versions in (potentially multiple)
* MSVCRT.
*
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/port/win32env.c,v 1.2 2009/02/12 12:53:34 mha Exp $
*
*-------------------------------------------------------------------------
*/
#include "c.h"
int
pgwin32_putenv(const char *envval)
{
char *envcpy;
char *cp;
/*
* Each version of MSVCRT has its own _putenv() call in the runtime
* library.
*
* If we're in VC 7.0 or later (means != mingw), update in
* the 6.0 MSVCRT.DLL environment as well, to work with third party
* libraries linked against it (such as gnuwin32 libraries).
*/
#if defined(_MSC_VER) && (_MSC_VER >= 1300)
typedef int (_cdecl *PUTENVPROC)(const char *);
HMODULE hmodule;
static PUTENVPROC putenvFunc = NULL;
int ret;
if (putenvFunc == NULL)
{
hmodule = GetModuleHandle("msvcrt");
if (hmodule == NULL)
return 1;
putenvFunc = (PUTENVPROC)GetProcAddress(hmodule, "_putenv");
if (putenvFunc == NULL)
return 1;
}
ret = putenvFunc(envval);
if (ret != 0)
return ret;
#endif /* _MSC_VER >= 1300 */
/*
* Update the process environment - to make modifications visible
* to child processes.
*
* Need a copy of the string so we can modify it.
*/
envcpy = strdup(envval);
cp = strchr(envcpy, '=');
if (cp == NULL)
return -1;
*cp = '\0';
cp++;
if (strlen(cp))
{
/*
* Only call SetEnvironmentVariable() when we are adding a variable,
* not when removing it. Calling it on both crashes on at least certain
* versions of MingW.
*/
if (!SetEnvironmentVariable(envcpy, cp))
{
free(envcpy);
return -1;
}
}
free(envcpy);
/* Finally, update our "own" cache */
return _putenv(envval);
}
void
pgwin32_unsetenv(const char *name)
{
char *envbuf;
envbuf = (char *) malloc(strlen(name)+2);
if (!envbuf)
return;
sprintf(envbuf, "%s=", name);
pgwin32_putenv(envbuf);
free(envbuf);
}