From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/file.c | 29 ++++++++++++++++------------- dlls/ucrtbase/tests/file.c | 10 +++++++++- 2 files changed, 25 insertions(+), 14 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 8bf191d6a61..22888d88a8a 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -3440,20 +3440,22 @@ __int64 CDECL _telli64(int fd) */ char * CDECL _tempnam(const char *dir, const char *prefix) { - char tmpbuf[MAX_PATH]; - const char *tmp_dir = getenv("TMP"); + wchar_t *dirW = NULL, *prefixW = NULL, *retW; + char *ret;
- if (tmp_dir) dir = tmp_dir; - - TRACE("dir (%s) prefix (%s)\n", dir, prefix); - if (GetTempFileNameA(dir,prefix,0,tmpbuf)) - { - TRACE("got name (%s)\n", tmpbuf); - DeleteFileA(tmpbuf); - return _strdup(tmpbuf); - } - TRACE("failed (%ld)\n", GetLastError()); - return NULL; + if (dir && !(dirW = wstrdupa_utf8(dir))) return NULL; + if (prefix && !(prefixW = wstrdupa_utf8(prefix))) + { + free(dirW); + return NULL; + } + retW = _wtempnam(dirW, prefixW); + free(dirW); + free(prefixW); + /* TODO: don't do the conversion */ + ret = astrdupw_utf8(retW); + free(retW); + return ret; }
/********************************************************************* @@ -3467,6 +3469,7 @@ wchar_t * CDECL _wtempnam(const wchar_t *dir, const wchar_t *prefix) if (tmp_dir) dir = tmp_dir;
TRACE("dir (%s) prefix (%s)\n", debugstr_w(dir), debugstr_w(prefix)); + /* TODO: use whole prefix */ if (GetTempFileNameW(dir,prefix,0,tmpbuf)) { TRACE("got name (%s)\n", debugstr_w(tmpbuf)); diff --git a/dlls/ucrtbase/tests/file.c b/dlls/ucrtbase/tests/file.c index 5615ea8c128..0214015c37a 100644 --- a/dlls/ucrtbase/tests/file.c +++ b/dlls/ucrtbase/tests/file.c @@ -238,7 +238,7 @@ static void test_utf8(void) const WCHAR fileW[] = L"file\x0119\x015b\x0107.a"; const WCHAR dirW[] = L"dir\x0119\x015b\x0107";
- char file2[32], buf[256], *p; + char file2[32], buf[256], *p, *q; struct _stat64 stat; FILE *f; int ret; @@ -339,6 +339,14 @@ static void test_utf8(void) ok(!ret, "_rmdir returned %d, errno %d\n", ret, errno); }
+ p = _tempnam(NULL, file); + ok(!!p, "_tempnam returned NULL, error %d\n", errno); + q = strrchr(p, '\'); + ok(!!q, "_tempnam returned %s\n", debugstr_a(p)); + todo_wine ok(!memcmp(q + 1, file, ARRAY_SIZE(file) - 1), + "incorrect file prefix: %s\n", debugstr_a(p)); + free(p); + setlocale(LC_ALL, "C"); }