Index: environ.cc =================================================================== RCS file: /cvs/src/src/winsup/cygwin/environ.cc,v retrieving revision 1.49 diff -u -p -2 -r1.49 environ.cc --- environ.cc 2001/05/04 20:39:38 1.49 +++ environ.cc 2001/05/09 18:29:38 @@ -729,4 +729,22 @@ env_sort (const void *a, const void *b) } +static char* +append_to_winenv (char* winenvp, const char* str) +{ + int len = strlen (str); + memcpy (winenvp, str, len + 1); + return (winenvp + len + 1); +} + +/* Keep this list in upper case and sorted */ +const char* forced_winenv_vars [] = + { + "SYSTEMDRIVE", + "SYSTEMROOT", + NULL + }; + +#define FORCED_WINENV_SIZE (sizeof (forced_winenv_vars) / sizeof (forced_winenv_vars[0])) + /* Create a Windows-style environment block, i.e. a typical character buffer filled with null terminated strings, terminated by double null characters. @@ -738,5 +756,29 @@ winenv (const char * const *envp, int ke int len, n, tl; const char * const *srcp; + const char * const *forced_srcp; const char * *dstp; + const char* forced_envp [FORCED_WINENV_SIZE]; + char* p; + + debug_printf ("envp %p, keep_posix %d", envp, keep_posix); + + tl = 0; + + for (srcp = forced_winenv_vars, dstp = forced_envp; *srcp; srcp++) + { + len = strlen (*srcp); + p = (char*) alloca (len + MAX_PATH); + strcpy (p, *srcp); + strcat (p, "="); + if (!GetEnvironmentVariable (*srcp, p + len + 1, MAX_PATH)) + debug_printf ("warning: %s not present in environment", *srcp); + else + { + tl += strlen (p) + 1; + *dstp = p; + dstp++; + } + } + *dstp = 0; for (n = 0; envp[n]; n++) @@ -745,7 +787,5 @@ winenv (const char * const *envp, int ke const char *newenvp[n + 1]; - debug_printf ("envp %p, keep_posix %d", envp, keep_posix); - - for (tl = 0, srcp = envp, dstp = newenvp; *srcp; srcp++, dstp++) + for (srcp = envp, dstp = newenvp; *srcp; srcp++, dstp++) { len = strcspn (*srcp, "=") + 1; @@ -781,10 +821,19 @@ winenv (const char * const *envp, int ke char *ptr, *envblock; envblock = (char *) malloc (tl + 2); - for (srcp = newenvp, ptr = envblock; *srcp; srcp++) + for (srcp = newenvp, ptr = envblock, forced_srcp = forced_envp; *srcp; srcp++) { - len = strlen (*srcp); - memcpy (ptr, *srcp, len + 1); - ptr += len + 1; + for (; *forced_srcp; forced_srcp++) + { + int cmp = strcmp (*forced_srcp, *srcp); + if (cmp < 0) + ptr = append_to_winenv (ptr, *forced_srcp); + else if (cmp > 0) + break; + } + ptr = append_to_winenv (ptr, *srcp); } + for (; *forced_srcp; forced_srcp++) + ptr = append_to_winenv (ptr, *forced_srcp); + *ptr = '\0'; /* Two null bytes at the end */