Add files from parent branch HEAD:
authorbranch-fixup <branch-fixup>
Tue, 22 Nov 2005 18:17:34 +0000 (18:17 +0000)
committerbranch-fixup <branch-fixup>
Tue, 22 Nov 2005 18:17:34 +0000 (18:17 +0000)
src/port/unsetenv.c

src/port/unsetenv.c [new file with mode: 0644]

diff --git a/src/port/unsetenv.c b/src/port/unsetenv.c
new file mode 100644 (file)
index 0000000..bc744a5
--- /dev/null
@@ -0,0 +1,56 @@
+/*-------------------------------------------------------------------------
+ *
+ * unsetenv.c
+ *       unsetenv() emulation for machines without it
+ *
+ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ *       $PostgreSQL$
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "c.h"
+
+
+void
+unsetenv(const char *name)
+{
+       char       *envstr;
+
+       if (getenv(name) == NULL)
+               return;                                 /* 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.
+        *
+        * 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;
+
+       /* Override the existing setting by forcibly defining the var */
+       sprintf(envstr, "%s=", name);
+       putenv(envstr);
+
+       /* 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.
+        */
+       putenv(envstr);
+}