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