From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/dir.c | 40 +++++++++++--------------------------- dlls/ucrtbase/tests/file.c | 6 ++++++ 2 files changed, 17 insertions(+), 29 deletions(-)
diff --git a/dlls/msvcrt/dir.c b/dlls/msvcrt/dir.c index abb3bc21388..b878a5ab1a9 100644 --- a/dlls/msvcrt/dir.c +++ b/dlls/msvcrt/dir.c @@ -869,39 +869,21 @@ int CDECL _getdrive(void) */ char* CDECL _getdcwd(int drive, char * buf, int size) { - static char* dummy; - - TRACE(":drive %d(%c), size %d\n",drive, drive + 'A' - 1, size); - - if (!drive || drive == _getdrive()) - return _getcwd(buf,size); /* current */ - else - { - char dir[MAX_PATH]; - char drivespec[] = "A:"; - int dir_len; + wchar_t dirW[MAX_PATH]; + int len;
- drivespec[0] += drive - 1; - if (GetDriveTypeA(drivespec) < DRIVE_REMOVABLE) - { - *_errno() = EACCES; - return NULL; - } + if (!_wgetdcwd(drive, dirW, ARRAY_SIZE(dirW))) return NULL;
- dir_len = GetFullPathNameA(drivespec,MAX_PATH,dir,&dummy); - if (dir_len >= size || dir_len < 1) + if (!buf) return astrdupw_utf8(dirW); + len = convert_wcs_to_acp_utf8(dirW, NULL, 0); + if (!len) return NULL; + if (len > size) { - *_errno() = ERANGE; - return NULL; /* buf too small */ + *_errno() = ERANGE; + return NULL; } - - TRACE(":returning '%s'\n", dir); - if (!buf) - return _strdup(dir); /* allocate */ - - strcpy(buf,dir); - } - return buf; + convert_wcs_to_acp_utf8(dirW, buf, size); + return buf; }
/********************************************************************* diff --git a/dlls/ucrtbase/tests/file.c b/dlls/ucrtbase/tests/file.c index 1bae5e4263d..620745be1ef 100644 --- a/dlls/ucrtbase/tests/file.c +++ b/dlls/ucrtbase/tests/file.c @@ -249,6 +249,12 @@ static void test_utf8(void) ok(!!p, "strrchr returned NULL, buf = %s\n", debugstr_a(buf)); ok(!strcmp(p + 1, dir), "unexpected working directory: %s\n", debugstr_a(buf));
+ p = _getdcwd(_getdrive(), buf, sizeof(buf)); + ok(p == buf, "_getcwd returned %p, errno %d\n", p, errno); + p = strrchr(p, '\'); + ok(!!p, "strrchr returned NULL, buf = %s\n", debugstr_a(buf)); + ok(!strcmp(p + 1, dir), "unexpected working directory: %s\n", debugstr_a(buf)); + ret = _chdir(".."); ok(!ret, "_chdir returned %d, error %d\n", ret, errno);