From 144bce24ff40180a70cedb6d4c4166ebb8531b7b Mon Sep 17 00:00:00 2001 From: Karsten Blees Date: Sun, 15 Jan 2012 00:05:04 +0100 Subject: [PATCH] Win32: move environment functions Move environment helper functions up so that they can be reused by mingw_getenv and mingw_spawnve_fd in subsequent patches. Signed-off-by: Karsten Blees --- compat/mingw.c | 106 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/compat/mingw.c b/compat/mingw.c index 704210635c..f96146c808 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -737,6 +737,53 @@ char *mingw_getcwd(char *pointer, int len) return pointer; } +static int env_compare(const void *a, const void *b) +{ + char *const *ea = a; + char *const *eb = b; + return strcasecmp(*ea, *eb); +} + +static int lookup_env(char **env, const char *name, size_t nmln) +{ + int i; + + for (i = 0; env[i]; i++) { + if (!strncasecmp(env[i], name, nmln) && '=' == env[i][nmln]) + /* matches */ + return i; + } + return -1; +} + +/* + * If name contains '=', then sets the variable, otherwise it unsets it + */ +static char **env_setenv(char **env, const char *name) +{ + char *eq = strchrnul(name, '='); + int i = lookup_env(env, name, eq-name); + + if (i < 0) { + if (*eq) { + for (i = 0; env[i]; i++) + ; + env = xrealloc(env, (i+2)*sizeof(*env)); + env[i] = (char*) name; + env[i+1] = NULL; + } + } + else { + free(env[i]); + if (*eq) + env[i] = (char*) name; + else + for (; env[i]; i++) + env[i] = env[i+1]; + } + return env; +} + #undef getenv char *mingw_getenv(const char *name) { @@ -754,6 +801,12 @@ char *mingw_getenv(const char *name) return result; } +int mingw_putenv(const char *namevalue) +{ + environ = env_setenv(environ, namevalue); + return 0; +} + /* * See http://msdn2.microsoft.com/en-us/library/17w5ykft(vs.71).aspx * (Parsing C++ Command-Line Arguments) @@ -942,13 +995,6 @@ static char *path_lookup(const char *cmd, char **path, int exe_only) return prog; } -static int env_compare(const void *a, const void *b) -{ - char *const *ea = a; - char *const *eb = b; - return strcasecmp(*ea, *eb); -} - struct pinfo_t { struct pinfo_t *next; pid_t pid; @@ -1231,46 +1277,6 @@ void free_environ(char **env) free(env); } -static int lookup_env(char **env, const char *name, size_t nmln) -{ - int i; - - for (i = 0; env[i]; i++) { - if (!strncasecmp(env[i], name, nmln) && '=' == env[i][nmln]) - /* matches */ - return i; - } - return -1; -} - -/* - * If name contains '=', then sets the variable, otherwise it unsets it - */ -static char **env_setenv(char **env, const char *name) -{ - char *eq = strchrnul(name, '='); - int i = lookup_env(env, name, eq-name); - - if (i < 0) { - if (*eq) { - for (i = 0; env[i]; i++) - ; - env = xrealloc(env, (i+2)*sizeof(*env)); - env[i] = (char*) name; - env[i+1] = NULL; - } - } - else { - free(env[i]); - if (*eq) - env[i] = (char*) name; - else - for (; env[i]; i++) - env[i] = env[i+1]; - } - return env; -} - /* * Copies global environ and adjusts variables as specified by vars. */ @@ -1285,12 +1291,6 @@ char **make_augmented_environ(const char *const *vars) return env; } -int mingw_putenv(const char *namevalue) -{ - environ = env_setenv(environ, namevalue); - return 0; -} - /* * Note, this isn't a complete replacement for getaddrinfo. It assumes * that service contains a numerical port, or that it is null. It -- 2.11.4.GIT