Piotr Caban : msvcrt: Add _wtmpnam_s implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Feb 3 07:40:00 CST 2016


Module: wine
Branch: stable
Commit: db15f1c3d29ac518c6b5277717b627c04b798089
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=db15f1c3d29ac518c6b5277717b627c04b798089

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Dec 22 17:47:21 2015 +0100

msvcrt: Add _wtmpnam_s implementation.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 77feb6938d98df205a386ad9a11a3106756168a5)
Signed-off-by: Michael Stefaniuc <mstefani at 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




More information about the wine-cvs mailing list