Module: wine Branch: stable Commit: db15f1c3d29ac518c6b5277717b627c04b798089 URL: http://source.winehq.org/git/wine.git/?a=commit;h=db15f1c3d29ac518c6b5277717...
Author: Piotr Caban piotr@codeweavers.com Date: Tue Dec 22 17:47:21 2015 +0100
msvcrt: Add _wtmpnam_s implementation.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit 77feb6938d98df205a386ad9a11a3106756168a5) Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
.../api-ms-win-crt-stdio-l1-1-0.spec | 2 +- dlls/msvcr100/msvcr100.spec | 4 +- dlls/msvcr110/msvcr110.spec | 4 +- dlls/msvcr120/msvcr120.spec | 4 +- dlls/msvcr120_app/msvcr120_app.spec | 2 +- dlls/msvcr70/msvcr70.spec | 2 +- dlls/msvcr71/msvcr71.spec | 2 +- dlls/msvcr80/msvcr80.spec | 4 +- dlls/msvcr90/msvcr90.spec | 4 +- dlls/msvcrt/file.c | 76 +++++++++++++++++----- dlls/msvcrt/msvcrt.spec | 4 +- dlls/ucrtbase/ucrtbase.spec | 4 +- 12 files changed, 77 insertions(+), 35 deletions(-)
diff --git a/dlls/api-ms-win-crt-stdio-l1-1-0/api-ms-win-crt-stdio-l1-1-0.spec b/dlls/api-ms-win-crt-stdio-l1-1-0/api-ms-win-crt-stdio-l1-1-0.spec index 5e0c3c9..223aa7c 100644 --- a/dlls/api-ms-win-crt-stdio-l1-1-0/api-ms-win-crt-stdio-l1-1-0.spec +++ b/dlls/api-ms-win-crt-stdio-l1-1-0/api-ms-win-crt-stdio-l1-1-0.spec @@ -111,7 +111,7 @@ @ cdecl _wsopen_s(ptr wstr long long long) ucrtbase._wsopen_s @ cdecl _wtempnam(wstr wstr) ucrtbase._wtempnam @ cdecl _wtmpnam(ptr) ucrtbase._wtmpnam -@ stub _wtmpnam_s +@ cdecl _wtmpnam_s(ptr long) ucrtbase._wtmpnam_s @ cdecl clearerr(ptr) ucrtbase.clearerr @ stub clearerr_s @ cdecl fclose(ptr) ucrtbase.fclose diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index d773fd8..d4cfa44 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1607,8 +1607,8 @@ @ cdecl _wstrtime_s(ptr long) @ cdecl _wsystem(wstr) @ cdecl _wtempnam(wstr wstr) MSVCRT__wtempnam -@ cdecl _wtmpnam(ptr) MSVCRT_wtmpnam -@ stub _wtmpnam_s +@ cdecl _wtmpnam(ptr) MSVCRT__wtmpnam +@ cdecl _wtmpnam_s(ptr long) MSVCRT__wtmpnam_s @ cdecl _wtof(wstr) MSVCRT__wtof @ cdecl _wtof_l(wstr ptr) MSVCRT__wtof_l @ cdecl _wtoi(wstr) MSVCRT__wtoi diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index f236a1e..8a4ee4a 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1965,8 +1965,8 @@ @ cdecl _wstrtime_s(ptr long) @ cdecl _wsystem(wstr) @ cdecl _wtempnam(wstr wstr) MSVCRT__wtempnam -@ cdecl _wtmpnam(ptr) MSVCRT_wtmpnam -@ stub _wtmpnam_s +@ cdecl _wtmpnam(ptr) MSVCRT__wtmpnam +@ cdecl _wtmpnam_s(ptr long) MSVCRT__wtmpnam_s @ cdecl _wtof(wstr) MSVCRT__wtof @ cdecl _wtof_l(wstr ptr) MSVCRT__wtof_l @ cdecl _wtoi(wstr) MSVCRT__wtoi diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index e7b53e9..47f79ca 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1989,8 +1989,8 @@ @ cdecl _wstrtime_s(ptr long) @ cdecl _wsystem(wstr) @ cdecl _wtempnam(wstr wstr) MSVCRT__wtempnam -@ cdecl _wtmpnam(ptr) MSVCRT_wtmpnam -@ stub _wtmpnam_s +@ cdecl _wtmpnam(ptr) MSVCRT__wtmpnam +@ cdecl _wtmpnam_s(ptr long) MSVCRT__wtmpnam_s @ cdecl _wtof(wstr) MSVCRT__wtof @ cdecl _wtof_l(wstr ptr) MSVCRT__wtof_l @ cdecl _wtoi(wstr) MSVCRT__wtoi diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index 757b2dc..6447c0d 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -1656,7 +1656,7 @@ @ cdecl _wstrtime_s(ptr long) msvcr120._wstrtime_s @ cdecl _wtempnam(wstr wstr) msvcr120._wtempnam @ cdecl _wtmpnam(ptr) msvcr120._wtmpnam -@ stub _wtmpnam_s +@ cdecl _wtmpnam_s(ptr long) msvcr120._wtmpnam_s @ cdecl _wtof(wstr) msvcr120._wtof @ cdecl _wtof_l(wstr ptr) msvcr120._wtof_l @ cdecl _wtoi(wstr) msvcr120._wtoi diff --git a/dlls/msvcr70/msvcr70.spec b/dlls/msvcr70/msvcr70.spec index 3382652..026d657 100644 --- a/dlls/msvcr70/msvcr70.spec +++ b/dlls/msvcr70/msvcr70.spec @@ -668,7 +668,7 @@ @ cdecl _wstrtime(ptr) MSVCRT__wstrtime @ cdecl _wsystem(wstr) @ cdecl _wtempnam(wstr wstr) MSVCRT__wtempnam -@ cdecl _wtmpnam(ptr) MSVCRT_wtmpnam +@ cdecl _wtmpnam(ptr) MSVCRT__wtmpnam @ cdecl _wtof(wstr) MSVCRT__wtof @ cdecl _wtoi(wstr) MSVCRT__wtoi @ cdecl -ret64 _wtoi64(wstr) MSVCRT__wtoi64 diff --git a/dlls/msvcr71/msvcr71.spec b/dlls/msvcr71/msvcr71.spec index fbdf839..6ebaa32 100644 --- a/dlls/msvcr71/msvcr71.spec +++ b/dlls/msvcr71/msvcr71.spec @@ -664,7 +664,7 @@ @ cdecl _wstrtime(ptr) MSVCRT__wstrtime @ cdecl _wsystem(wstr) @ cdecl _wtempnam(wstr wstr) MSVCRT__wtempnam -@ cdecl _wtmpnam(ptr) MSVCRT_wtmpnam +@ cdecl _wtmpnam(ptr) MSVCRT__wtmpnam @ cdecl _wtof(wstr) MSVCRT__wtof @ cdecl _wtoi(wstr) MSVCRT__wtoi @ cdecl -ret64 _wtoi64(wstr) MSVCRT__wtoi64 diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 31bafe0..4def939 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -1290,8 +1290,8 @@ @ cdecl _wstrtime_s(ptr long) @ cdecl _wsystem(wstr) @ cdecl _wtempnam(wstr wstr) MSVCRT__wtempnam -@ cdecl _wtmpnam(ptr) MSVCRT_wtmpnam -@ stub _wtmpnam_s +@ cdecl _wtmpnam(ptr) MSVCRT__wtmpnam +@ cdecl _wtmpnam_s(ptr long) MSVCRT__wtmpnam_s @ cdecl _wtof(wstr) MSVCRT__wtof @ cdecl _wtof_l(wstr ptr) MSVCRT__wtof_l @ cdecl _wtoi(wstr) MSVCRT__wtoi diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 05dd4e3..752db52 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -1262,8 +1262,8 @@ @ cdecl _wstrtime_s(ptr long) @ cdecl _wsystem(wstr) @ cdecl _wtempnam(wstr wstr) MSVCRT__wtempnam -@ cdecl _wtmpnam(ptr) MSVCRT_wtmpnam -@ stub _wtmpnam_s +@ cdecl _wtmpnam(ptr) MSVCRT__wtmpnam +@ cdecl _wtmpnam_s(ptr long) MSVCRT__wtmpnam_s @ cdecl _wtof(wstr) MSVCRT__wtof @ cdecl _wtof_l(wstr ptr) MSVCRT__wtof_l @ cdecl _wtoi(wstr) MSVCRT__wtoi diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index a708c67..9f35a62 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -4852,15 +4852,68 @@ char * CDECL MSVCRT_tmpnam(char *s) return tmpnam_helper(s, -1, &tmpnam_unique, MSVCRT_TMP_MAX) ? NULL : s; }
+static int wtmpnam_helper(MSVCRT_wchar_t *s, MSVCRT_size_t size, int *tmpnam_unique, int tmp_max) +{ + MSVCRT_wchar_t tmpstr[8]; + MSVCRT_wchar_t *p = s; + int digits; + + if (!MSVCRT_CHECK_PMT(s != NULL)) return MSVCRT_EINVAL; + + if (size < 3) { + if (size) *s = 0; + *MSVCRT__errno() = MSVCRT_ERANGE; + return MSVCRT_ERANGE; + } + *p++ = '\'; + *p++ = 's'; + size -= 2; + digits = msvcrt_int_to_base32_w(GetCurrentProcessId(), tmpstr); + if (digits+1 > size) { + *s = 0; + *MSVCRT__errno() = MSVCRT_ERANGE; + return MSVCRT_ERANGE; + } + memcpy(p, tmpstr, digits*sizeof(tmpstr[0])); + p += digits; + *p++ = '.'; + size -= digits+1; + + while(1) { + while ((digits = *tmpnam_unique)+1 < tmp_max) { + if (InterlockedCompareExchange(tmpnam_unique, digits+1, digits) == digits) + break; + } + + digits = msvcrt_int_to_base32_w(digits, tmpstr); + if (digits+1 > size) { + *s = 0; + *MSVCRT__errno() = MSVCRT_ERANGE; + return MSVCRT_ERANGE; + } + memcpy(p, tmpstr, digits*sizeof(tmpstr[0])); + p[digits] = 0; + + if (GetFileAttributesW(s) == INVALID_FILE_ATTRIBUTES && + GetLastError() == ERROR_FILE_NOT_FOUND) + break; + } + return 0; +} + +/********************************************************************* + * _wtmpnam_s (MSVCRT.@) + */ +int CDECL MSVCRT__wtmpnam_s(MSVCRT_wchar_t *s, MSVCRT_size_t size) +{ + return wtmpnam_helper(s, size, &tmpnam_s_unique, MSVCRT_TMP_MAX_S); +} + /********************************************************************* * _wtmpnam (MSVCRT.@) */ -MSVCRT_wchar_t * CDECL MSVCRT_wtmpnam(MSVCRT_wchar_t *s) +MSVCRT_wchar_t * CDECL MSVCRT__wtmpnam(MSVCRT_wchar_t *s) { - static const MSVCRT_wchar_t format[] = {'\','s','%','s','.',0}; - MSVCRT_wchar_t tmpstr[16]; - MSVCRT_wchar_t *p; - int count, size; if (!s) { thread_data_t *data = msvcrt_get_thread_data();
@@ -4870,18 +4923,7 @@ MSVCRT_wchar_t * CDECL MSVCRT_wtmpnam(MSVCRT_wchar_t *s) s = data->wtmpnam_buffer; }
- msvcrt_int_to_base32_w(GetCurrentProcessId(), tmpstr); - p = s + MSVCRT__snwprintf(s, MAX_PATH, format, tmpstr); - for (count = 0; count < MSVCRT_TMP_MAX; count++) - { - size = msvcrt_int_to_base32_w(tmpnam_unique++, tmpstr); - memcpy(p, tmpstr, size*sizeof(MSVCRT_wchar_t)); - p[size] = '\0'; - if (GetFileAttributesW(s) == INVALID_FILE_ATTRIBUTES && - GetLastError() == ERROR_FILE_NOT_FOUND) - break; - } - return s; + return wtmpnam_helper(s, -1, &tmpnam_unique, MSVCRT_TMP_MAX) ? NULL : s; }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 24d7c57..ca1c97f 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -1224,8 +1224,8 @@ @ cdecl _wsystem(wstr) @ cdecl _wtempnam(wstr wstr) MSVCRT__wtempnam # stub _wtempnam_dbg(wstr wstr long str long) -@ cdecl _wtmpnam(ptr) MSVCRT_wtmpnam -# stub _wtmpnam_s(ptr long) +@ cdecl _wtmpnam(ptr) MSVCRT__wtmpnam +@ cdecl _wtmpnam_s(ptr long) MSVCRT__wtmpnam_s @ cdecl _wtof(wstr) MSVCRT__wtof @ cdecl _wtof_l(wstr ptr) MSVCRT__wtof_l @ cdecl _wtoi(wstr) MSVCRT__wtoi diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 7b23329..44b01af 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -2131,8 +2131,8 @@ @ cdecl _wstrtime_s(ptr long) @ cdecl _wsystem(wstr) @ cdecl _wtempnam(wstr wstr) MSVCRT__wtempnam -@ cdecl _wtmpnam(ptr) MSVCRT_wtmpnam -@ stub _wtmpnam_s +@ cdecl _wtmpnam(ptr) MSVCRT__wtmpnam +@ cdecl _wtmpnam_s(ptr long) MSVCRT__wtmpnam_s @ cdecl _wtof(wstr) MSVCRT__wtof @ cdecl _wtof_l(wstr ptr) MSVCRT__wtof_l @ cdecl _wtoi(wstr) MSVCRT__wtoi