From 067f2e7eaf36deac1175eaf24eeb118adcd37179 Mon Sep 17 00:00:00 2001
From: Ron Yorston <rmy@pobox.com>
Date: Thu, 18 Dec 2014 10:08:26 +0000
Subject: Revert "Use putenv to implement unsetenv/clearenv"

This reverts commit fa147bd7ecb086f4fb9a4afea16b946693a822ce.
---
 include/mingw.h |  4 +---
 win32/env.c     | 57 +++++++++++----------------------------------------------
 2 files changed, 12 insertions(+), 49 deletions(-)

diff --git a/include/mingw.h b/include/mingw.h
index 80d9b7987..5f6016dee 100644
--- a/include/mingw.h
+++ b/include/mingw.h
@@ -180,15 +180,13 @@ int mingw_system(const char *cmd);
 
 int clearenv(void);
 char *mingw_getenv(const char *name);
-int mingw_putenv(const char *env);
 char *mingw_mktemp(char *template);
 int mkstemp(char *template);
 char *realpath(const char *path, char *resolved_path);
 int setenv(const char *name, const char *value, int replace);
-int unsetenv(const char *env);
+void unsetenv(const char *env);
 
 #define getenv mingw_getenv
-#define putenv mingw_putenv
 #define mktemp mingw_mktemp
 
 /*
diff --git a/win32/env.c b/win32/env.c
index eb2e1f004..f8d231a8f 100644
--- a/win32/env.c
+++ b/win32/env.c
@@ -104,62 +104,27 @@ char **env_setenv(char **env, const char *name)
 		else {
 			for (; env[i]; i++)
 				env[i] = env[i+1];
+			SetEnvironmentVariable(name, NULL);
 		}
 	}
 	return env;
 }
 
-/*
- * Removing an environment variable with WIN32 putenv requires an argument
- * like "NAME="; glibc omits the '='.  The implementations of unsetenv and
- * clearenv allow for this.
- *
- * It isn't possible to create an environment variable with an empty value
- * using WIN32 putenv.
- */
-#undef putenv
-int unsetenv(const char *env)
+void unsetenv(const char *env)
 {
-	char *name;
-	int ret;
-
-	name = xmalloc(strlen(env)+2);
-	strcat(strcpy(name, env), "=");
-	ret = putenv(name);
-	free(name);
-
-	return ret;
+	env_setenv(environ, env);
 }
 
 int clearenv(void)
 {
-	char *name, *s;
-
-	while ( environ && *environ ) {
-		if ( (s=strchr(*environ, '=')) != NULL ) {
-			name = xstrndup(*environ, s-*environ+1);
-			putenv(name);
-			free(name);
-		}
-		else {
-			return -1;
-		}
-	}
-	return 0;
-}
-
-int mingw_putenv(const char *env)
-{
-	char *s;
-
-	if ( (s=strchr(env, '=')) == NULL ) {
-		return unsetenv(env);
+	char **env = environ;
+	if (!env)
+		return 0;
+	while (*env) {
+		free(*env);
+		env++;
 	}
-
-	if ( s[1] != '\0' ) {
-		return putenv(env);
-	}
-
-	/* can't set empty value */
+	free(env);
+	environ = NULL;
 	return 0;
 }
-- 
cgit v1.2.3-55-g6feb