ChangeLog: Fixed a special case in DOSFS_GetFullName() for files mapped through the drive "/". Description: There was already code trying to support a "/" drive, but it wasn't quite working. We had to add a special case if root is "/". Warren Baird : Warren_Baird@cimmetry.com Louis Thibault Dave Belanger diff -ur clean/wine/files/dos_fs.c wine/files/dos_fs.c --- clean/wine/files/dos_fs.c Wed Jan 29 15:31:01 2003 +++ wine/files/dos_fs.c Mon Feb 3 13:55:25 2003 @@ -973,7 +973,7 @@ drive = toupperW(*p) - 'A'; *name += 2; } - else if (*p == '/') /* Absolute Unix path? */ + else if ((*p == '/') || (*p == '\\')) /* Absolute Unix path? */ { if ((drive = DRIVE_FindDriveRootW( name )) == -1) { @@ -1032,7 +1032,8 @@ strcpyW( full->short_name, driveA_rootW ); full->short_name[0] += full->drive; - if ((*name == '\\') || (*name == '/')) /* Absolute path */ + if ((*name == '\\') || (*name == '/') || /* Absolute path */ + ((root[0] == '/') && (root[1] == '\0'))) /* root directory */ { while ((*name == '\\') || (*name == '/')) name++; } @@ -1485,21 +1486,22 @@ FIXME("internal: error getting DOS Drive Root\n"); return 0; } - if (!strcmp(root,"/")) - {(!strcmp(root,"/"))rror - /* we have just the last / and we need it. */ - p_l = full_name.long_name; - } - else - { - p_l = full_name.long_name + strlen(root); - } + + p_l = full_name.long_name +strlen(root); /* append long name (= unix name) to drive */ MultiByteToWideChar(DRIVE_GetCodepage(drive), 0, p_l, -1, full_name.short_name + 2, MAX_PATHNAME_LEN - 3); /* append name to treat */ namelen= strlenW(full_name.short_name); - p = (LPWSTR)name; + + if (!strcmp(root,"/")) + { + p = (LPWSTR)name + 1; + } + else + { + p = (LPWSTR)name; + } if (driveletter) p += 2; /* skip drive name when appending */ if (namelen + 2 + strlenW(p) > MAX_PATHNAME_LEN) diff -ur clean/wine/files/drive.c wine/files/drive.c --- clean/wine/files/drive.c Wed Jan 29 15:31:01 2003 +++ wine/files/drive.c Mon Feb 3 13:51:10 2003 @@ -479,6 +479,7 @@ { int drive, rootdrive = -1; char buffer[MAX_PATHNAME_LEN]; + char* pBuffer; LPCWSTR p = *path; int len, match_len = -1; @@ -490,6 +491,9 @@ WideCharToMultiByte(DOSDrives[drive].codepage, 0, *path, -1, buffer, MAX_PATHNAME_LEN, NULL, NULL); + while ((pBuffer = strchr( buffer, '\\' )) != NULL) + *pBuffer = '/'; + len = strlen(DOSDrives[drive].root); if(strncmp(DOSDrives[drive].root, buffer, len)) continue; @@ -1093,19 +1097,11 @@ int DRIVE_Chdir( int drive, LPCWSTR path ) { DOS_FULL_NAME full_name; - WCHAR buffer[MAX_PATHNAME_LEN]; LPSTR unix_cwd; BY_HANDLE_FILE_INFORMATION info; TDB *pTask = TASK_GetCurrent(); - buffer[0] = 'A' + drive; - buffer[1] = ':'; - buffer[2] = 0; - TRACE("(%s,%s)\n", debugstr_w(buffer), debugstr_w(path) ); - strncpyW( buffer + 2, path, MAX_PATHNAME_LEN - 2 ); - buffer[MAX_PATHNAME_LEN - 1] = 0; /* ensure 0 termination */ - - if (!DOSFS_GetFullName( buffer, TRUE, &full_name )) return 0; + if (!DOSFS_GetFullName( path, TRUE, &full_name )) return 0; if (!FILE_Stat( full_name.long_name, &info, NULL )) return 0; if (!(info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { @@ -1786,6 +1782,7 @@ */ BOOL WINAPI SetCurrentDirectoryW( LPCWSTR dir ) { + DOS_FULL_NAME full_name; int drive, olddrive = DRIVE_GetCurrentDrive(); if (!dir) @@ -1797,6 +1794,10 @@ { drive = toupperW( *dir ) - 'A'; dir += 2; + } + else if ( DOSFS_GetFullName( dir, FALSE, &full_name ) ) + { + drive = full_name.drive; } else drive = olddrive;