on Windows, cwd strings in the environment should be of the
Gurusamy Sarathy [Mon, 9 Oct 2000 18:41:40 +0000 (18:41 +0000)]
form =X:=X:\foo instead of =X=X:\foo\

p4raw-id: //depot/perl@7172

win32/vdir.h

index 0b634a8..37cb4a5 100644 (file)
@@ -461,29 +461,37 @@ int VDir::SetCurrentDirectoryA(char *lpBuffer)
 }
 
 DWORD VDir::CalculateEnvironmentSpace(void)
-{   /* the current directory environment strings are stored as '=d=d:\path' */
+{   /* the current directory environment strings are stored as '=D:=d:\path' */
     int index;
     DWORD dwSize = 0;
     for (index = 0; index < driveCount; ++index) {
        if (dirTableA[index] != NULL) {
-           dwSize += strlen(dirTableA[index]) + 4;  /* add 1 for trailing NULL and 3 for '=d=' */
+           dwSize += strlen(dirTableA[index]) + 5;  /* add 1 for trailing NULL and 4 for '=D:=' */
        }
     }
     return dwSize;
 }
 
 LPSTR VDir::BuildEnvironmentSpace(LPSTR lpStr)
-{   /* store the current directory environment strings as '=d=d:\path' */
-    int index;
+{   /* store the current directory environment strings as '=D:=d:\path' */
+    int index, length;
     LPSTR lpDirStr;
     for (index = 0; index < driveCount; ++index) {
        lpDirStr = dirTableA[index];
        if (lpDirStr != NULL) {
            lpStr[0] = '=';
            lpStr[1] = lpDirStr[0];
-           lpStr[2] = '=';
-           strcpy(&lpStr[3], lpDirStr);
-           lpStr += strlen(lpDirStr) + 4; /* add 1 for trailing NULL and 3 for '=d=' */
+           lpStr[2] = '\0';
+           CharUpper(&lpStr[1]);
+           lpStr[2] = ':';
+           lpStr[3] = '=';
+           strcpy(&lpStr[4], lpDirStr);
+           length = strlen(lpDirStr);
+           lpStr += length + 5; /* add 1 for trailing NULL and 4 for '=D:=' */
+           if (length > 3 && IsPathSep(lpStr[-2])) {
+               lpStr[-2] = '\0';   /* remove the trailing path separator */
+               --lpStr;
+           }
        }
     }
     return lpStr;