From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/dir.c | 11 +++++++---- dlls/msvcrt/msvcrt.h | 18 ++++++++++++++++++ dlls/ucrtbase/tests/file.c | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 4 deletions(-)
diff --git a/dlls/msvcrt/dir.c b/dlls/msvcrt/dir.c index 546e8d49a7b..648c8d80884 100644 --- a/dlls/msvcrt/dir.c +++ b/dlls/msvcrt/dir.c @@ -1004,10 +1004,13 @@ unsigned int CDECL _getdiskfree(unsigned int disk, struct _diskfree_t * d) */ int CDECL _mkdir(const char * newdir) { - if (CreateDirectoryA(newdir,NULL)) - return 0; - msvcrt_set_errno(GetLastError()); - return -1; + wchar_t *newdirW = NULL; + int ret; + + if (newdir && !(newdirW = wstrdupa_utf8(newdir))) return -1; + ret = _wmkdir(newdirW); + free(newdirW); + return ret; }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index eaaf8b0034d..71b0f9039f1 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -62,6 +62,7 @@ typedef struct _iobuf
#include "windef.h" #include "winbase.h" +#include "winnls.h" #undef strncpy #undef wcsncpy
@@ -411,4 +412,21 @@ extern char* __cdecl __unDName(char *,const char*,int,malloc_func_t,free_func_t,
#define INHERIT_THREAD_PRIORITY 0xF000
+static inline int convert_acp_utf8_to_wcs(const char *str, wchar_t *wstr, int len) +{ + return MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstr, len); +} + +static inline wchar_t* wstrdupa_utf8(const char *str) +{ + int len = convert_acp_utf8_to_wcs(str, NULL, 0); + wchar_t *wstr; + + if (!len) return NULL; + wstr = malloc(len * sizeof(wchar_t)); + if (!wstr) return NULL; + convert_acp_utf8_to_wcs(str, wstr, len); + return wstr; +} + #endif /* __WINE_MSVCRT_H */ diff --git a/dlls/ucrtbase/tests/file.c b/dlls/ucrtbase/tests/file.c index 99372a391e3..ec2035a9f91 100644 --- a/dlls/ucrtbase/tests/file.c +++ b/dlls/ucrtbase/tests/file.c @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#include <errno.h> +#include <direct.h> #include <stdarg.h> #include <locale.h> #include <share.h> @@ -216,10 +218,43 @@ static void test_fopen(void) setlocale(LC_ALL, "C"); }
+static void test_utf8(void) +{ + const char dir[] = "dir\xc4\x99\xc5\x9b\xc4\x87"; + const WCHAR dirW[] = L"dir\x0119\x015b\x0107"; + + int ret; + + if (!setlocale(LC_ALL, ".utf8")) + { + win_skip("utf-8 tests\n"); + return; + } + + ret = _mkdir(dir); + if (ret == -1 && errno == ENOENT) + { + skip("can't create test environment\n"); + return; + } + ok(!ret, "_mkdir returned %d, error %d\n", ret, errno); + + ret = _wrmdir(dirW); + todo_wine ok(!ret, "_wrmdir returned %d, errno %d\n", ret, errno); + if (ret) + { + ret = _rmdir(dir); + ok(!ret, "_rmdir returned %d, errno %d\n", ret, errno); + } + + setlocale(LC_ALL, "C"); +} + START_TEST(file) { test_std_stream_buffering(); test_iobuf_layout(); test_std_stream_open(); test_fopen(); + test_utf8(); }