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 */
 
