From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/file.c | 20 ++++++-------------- dlls/ucrtbase/tests/file.c | 3 +++ 2 files changed, 9 insertions(+), 14 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 72898fc01e0..adb849e1781 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -993,21 +993,13 @@ FILE * CDECL __acrt_iob_func(unsigned idx) */ int CDECL _access(const char *filename, int mode) { - DWORD attr = GetFileAttributesA(filename); - - TRACE("(%s,%d) %ld\n", filename, mode, attr); + wchar_t *filenameW = NULL; + int ret;
- if (!filename || attr == INVALID_FILE_ATTRIBUTES) - { - msvcrt_set_errno(GetLastError()); - return -1; - } - if ((attr & FILE_ATTRIBUTE_READONLY) && (mode & MSVCRT_W_OK)) - { - msvcrt_set_errno(ERROR_ACCESS_DENIED); - return -1; - } - return 0; + if (filename && !(filenameW = wstrdupa_utf8(filename))) return -1; + ret = _waccess(filenameW, mode); + free(filenameW); + return ret; }
/********************************************************************* diff --git a/dlls/ucrtbase/tests/file.c b/dlls/ucrtbase/tests/file.c index 8b696880eea..201ac7fe07f 100644 --- a/dlls/ucrtbase/tests/file.c +++ b/dlls/ucrtbase/tests/file.c @@ -283,6 +283,9 @@ static void test_utf8(void) ok(!!f, "fopen returned %d, error %d\n", ret, errno); fclose(f);
+ ret = access(file, 0); + ok(!ret, "access returned %d, error %d\n", ret, errno); + ret = _wunlink(fileW); todo_wine_if(GetACP() != CP_UTF8) ok(!ret, "_wunlink returned %d, errno %d\n", ret, errno); if (ret)