mirror of https://github.com/postgres/postgres
setenv() and unsetenv() are in SUSv3 and targeted Unix systems have them. We still need special code for these on Windows, but that doesn't require a configure probe. This marks the first time we require a SUSv3 (POSIX.1-2001) facility (rather than SUSv2). The replacement code removed here was not needed on any targeted system or any known non-EOL'd Unix system, and was therefore dead and untested. No need for vestigial HAVE_SETENV and HAVE_UNSETENV macros, because we provide a replacement for Windows, and we didn't previously test the macros. Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Reviewed-by: Greg Stark <stark@mit.edu> Reviewed-by: Robert Haas <robertmhaas@gmail.com> Reviewed-by: Andres Freund <andres@anarazel.de> Discussion: https://postgr.es/m/CA+hUKGJ3LHeP9w5Fgzdr4G8AnEtJ=z=p6hGDEm4qYGEUX5B6fQ@mail.gmail.compull/100/head
parent
b79ec732d2
commit
71f5dc6dfb
@ -1,48 +0,0 @@ |
|||||||
/*-------------------------------------------------------------------------
|
|
||||||
* |
|
||||||
* setenv.c |
|
||||||
* setenv() emulation for machines without it |
|
||||||
* |
|
||||||
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group |
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California |
|
||||||
* |
|
||||||
* |
|
||||||
* IDENTIFICATION |
|
||||||
* src/port/setenv.c |
|
||||||
* |
|
||||||
*------------------------------------------------------------------------- |
|
||||||
*/ |
|
||||||
|
|
||||||
#include "c.h" |
|
||||||
|
|
||||||
|
|
||||||
int |
|
||||||
setenv(const char *name, const char *value, int overwrite) |
|
||||||
{ |
|
||||||
char *envstr; |
|
||||||
|
|
||||||
/* Error conditions, per POSIX */ |
|
||||||
if (name == NULL || name[0] == '\0' || strchr(name, '=') != NULL || |
|
||||||
value == NULL) |
|
||||||
{ |
|
||||||
errno = EINVAL; |
|
||||||
return -1; |
|
||||||
} |
|
||||||
|
|
||||||
/* No work if variable exists and we're not to replace it */ |
|
||||||
if (overwrite == 0 && getenv(name) != NULL) |
|
||||||
return 0; |
|
||||||
|
|
||||||
/*
|
|
||||||
* Add or replace the value using putenv(). This will leak memory if the |
|
||||||
* same variable is repeatedly redefined, but there's little we can do |
|
||||||
* about that when sitting atop putenv(). |
|
||||||
*/ |
|
||||||
envstr = (char *) malloc(strlen(name) + strlen(value) + 2); |
|
||||||
if (!envstr) /* not much we can do if no memory */ |
|
||||||
return -1; |
|
||||||
|
|
||||||
sprintf(envstr, "%s=%s", name, value); |
|
||||||
|
|
||||||
return putenv(envstr); |
|
||||||
} |
|
@ -1,65 +0,0 @@ |
|||||||
/*-------------------------------------------------------------------------
|
|
||||||
* |
|
||||||
* unsetenv.c |
|
||||||
* unsetenv() emulation for machines without it |
|
||||||
* |
|
||||||
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group |
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California |
|
||||||
* |
|
||||||
* |
|
||||||
* IDENTIFICATION |
|
||||||
* src/port/unsetenv.c |
|
||||||
* |
|
||||||
*------------------------------------------------------------------------- |
|
||||||
*/ |
|
||||||
|
|
||||||
#include "c.h" |
|
||||||
|
|
||||||
|
|
||||||
int |
|
||||||
unsetenv(const char *name) |
|
||||||
{ |
|
||||||
char *envstr; |
|
||||||
|
|
||||||
/* Error conditions, per POSIX */ |
|
||||||
if (name == NULL || name[0] == '\0' || strchr(name, '=') != NULL) |
|
||||||
{ |
|
||||||
errno = EINVAL; |
|
||||||
return -1; |
|
||||||
} |
|
||||||
|
|
||||||
if (getenv(name) == NULL) |
|
||||||
return 0; /* no work */ |
|
||||||
|
|
||||||
/*
|
|
||||||
* The technique embodied here works if libc follows the Single Unix Spec |
|
||||||
* and actually uses the storage passed to putenv() to hold the environ |
|
||||||
* entry. When we clobber the entry in the second step we are ensuring |
|
||||||
* that we zap the actual environ member. However, there are some libc |
|
||||||
* implementations (notably recent BSDs) that do not obey SUS but copy the |
|
||||||
* presented string. This method fails on such platforms. Hopefully all |
|
||||||
* such platforms have unsetenv() and thus won't be using this hack. See: |
|
||||||
* http://www.greenend.org.uk/rjk/2008/putenv.html
|
|
||||||
* |
|
||||||
* Note that repeatedly setting and unsetting a var using this code will |
|
||||||
* leak memory. |
|
||||||
*/ |
|
||||||
|
|
||||||
envstr = (char *) malloc(strlen(name) + 2); |
|
||||||
if (!envstr) /* not much we can do if no memory */ |
|
||||||
return -1; |
|
||||||
|
|
||||||
/* Override the existing setting by forcibly defining the var */ |
|
||||||
sprintf(envstr, "%s=", name); |
|
||||||
if (putenv(envstr)) |
|
||||||
return -1; |
|
||||||
|
|
||||||
/* Now we can clobber the variable definition this way: */ |
|
||||||
strcpy(envstr, "="); |
|
||||||
|
|
||||||
/*
|
|
||||||
* This last putenv cleans up if we have multiple zero-length names as a |
|
||||||
* result of unsetting multiple things. |
|
||||||
*/ |
|
||||||
return putenv(envstr); |
|
||||||
} |
|
Loading…
Reference in new issue