Piotr Caban : msvcrt: Add _mktemp_s implementation.

Alexandre Julliard julliard at winehq.org
Wed Jul 24 14:55:27 CDT 2013


Module: wine
Branch: master
Commit: 7d41f9b3e90943f2112bd986ec5f70781af3125c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7d41f9b3e90943f2112bd986ec5f70781af3125c

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Wed Jul 24 12:20:42 2013 +0200

msvcrt: Add _mktemp_s implementation.

---

 dlls/msvcr100/msvcr100.spec |    2 +-
 dlls/msvcr110/msvcr110.spec |    2 +-
 dlls/msvcr80/msvcr80.spec   |    2 +-
 dlls/msvcr90/msvcr90.spec   |    2 +-
 dlls/msvcrt/file.c          |   39 +++++++++++++++++++++++++++++++++++++++
 dlls/msvcrt/msvcrt.spec     |    2 +-
 include/msvcrt/io.h         |    1 +
 7 files changed, 45 insertions(+), 5 deletions(-)

diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 9479d5e..9012225 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -1204,7 +1204,7 @@
 @ cdecl _mkgmtime32(ptr) msvcrt._mkgmtime32
 @ cdecl _mkgmtime64(ptr) msvcrt._mkgmtime64
 @ cdecl _mktemp(str) msvcrt._mktemp
-@ stub _mktemp_s
+@ cdecl _mktemp_s(str long) msvcrt._mktemp_s
 @ cdecl _mktime32(ptr) msvcrt._mktime32
 @ cdecl _mktime64(ptr) msvcrt._mktime64
 @ cdecl _msize(ptr) msvcrt._msize
diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec
index b83bfe0..ad6d159 100644
--- a/dlls/msvcr110/msvcr110.spec
+++ b/dlls/msvcr110/msvcr110.spec
@@ -1566,7 +1566,7 @@
 @ cdecl _mkgmtime32(ptr) msvcrt._mkgmtime32
 @ cdecl _mkgmtime64(ptr) msvcrt._mkgmtime64
 @ cdecl _mktemp(str) msvcrt._mktemp
-@ stub _mktemp_s
+@ cdecl _mktemp_s(str long) msvcrt._mktemp_s
 @ cdecl _mktime32(ptr) msvcrt._mktime32
 @ cdecl _mktime64(ptr) msvcrt._mktime64
 @ cdecl _msize(ptr) msvcrt._msize
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index b8118a9..59ee88d 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -875,7 +875,7 @@
 @ cdecl _mkgmtime32(ptr) msvcrt._mkgmtime32
 @ cdecl _mkgmtime64(ptr) msvcrt._mkgmtime64
 @ cdecl _mktemp(str) msvcrt._mktemp
-@ stub _mktemp_s
+@ cdecl _mktemp_s(str long) msvcrt._mktemp_s
 @ cdecl _mktime32(ptr) msvcrt._mktime32
 @ cdecl _mktime64(ptr) msvcrt._mktime64
 @ cdecl _msize(ptr) msvcrt._msize
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index 8467b91..5d2ebf6 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -853,7 +853,7 @@
 @ cdecl _mkgmtime32(ptr) msvcrt._mkgmtime32
 @ cdecl _mkgmtime64(ptr) msvcrt._mkgmtime64
 @ cdecl _mktemp(str) msvcrt._mktemp
-@ stub _mktemp_s
+@ cdecl _mktemp_s(str long) msvcrt._mktemp_s
 @ cdecl _mktime32(ptr) msvcrt._mktime32
 @ cdecl _mktime64(ptr) msvcrt._mktime64
 @ cdecl _msize(ptr) msvcrt._msize
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index a07e940..35e2c00 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -1682,6 +1682,45 @@ MSVCRT_intptr_t CDECL MSVCRT__get_osfhandle(int fd)
 }
 
 /*********************************************************************
+ *		_mktemp_s (MSVCRT.@)
+ */
+int CDECL MSVCRT__mktemp_s(char *pattern, MSVCRT_size_t size)
+{
+    DWORD len, xno, id;
+
+    if(!MSVCRT_CHECK_PMT(pattern!=NULL))
+        return MSVCRT_EINVAL;
+
+    for(len=0; len<size; len++)
+        if(!pattern[len])
+            break;
+    if(!MSVCRT_CHECK_PMT(len!=size && len>=6)) {
+        if(size)
+            pattern[0] = 0;
+        return MSVCRT_EINVAL;
+    }
+
+    for(xno=1; xno<=6; xno++)
+        if(!MSVCRT_CHECK_PMT(pattern[len-xno] == 'X'))
+            return MSVCRT_EINVAL;
+
+    id = GetCurrentProcessId();
+    for(xno=1; xno<6; xno++) {
+        pattern[len-xno] = id%10 + '0';
+        id /= 10;
+    }
+
+    for(pattern[len-6]='a'; pattern[len-6]<='z'; pattern[len-6]++) {
+        if(GetFileAttributesA(pattern) == INVALID_FILE_ATTRIBUTES)
+            return 0;
+    }
+
+    pattern[0] = 0;
+    *MSVCRT__errno() = MSVCRT_EEXIST;
+    return MSVCRT_EEXIST;
+}
+
+/*********************************************************************
  *		_mktemp (MSVCRT.@)
  */
 char * CDECL MSVCRT__mktemp(char *pattern)
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index e12d87f..e566440 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -830,7 +830,7 @@
 @ cdecl _mkgmtime32(ptr) MSVCRT__mkgmtime32
 @ cdecl _mkgmtime64(ptr) MSVCRT__mkgmtime64
 @ cdecl _mktemp(str) MSVCRT__mktemp
-# stub _mktemp_s(str long)
+@ cdecl _mktemp_s(str long) MSVCRT__mktemp_s
 @ cdecl _mktime32(ptr) MSVCRT__mktime32
 @ cdecl _mktime64(ptr) MSVCRT__mktime64
 @ cdecl _msize(ptr)
diff --git a/include/msvcrt/io.h b/include/msvcrt/io.h
index ad5c507..09b615c 100644
--- a/include/msvcrt/io.h
+++ b/include/msvcrt/io.h
@@ -108,6 +108,7 @@ int         __cdecl _locking(int,int,__msvcrt_long);
 __msvcrt_long __cdecl _lseek(int,__msvcrt_long,int);
 __int64     __cdecl _lseeki64(int,__int64,int);
 char*       __cdecl _mktemp(char*);
+int         __cdecl _mktemp_s(char*,size_t);
 int         __cdecl _open(const char*,int,...);
 int         __cdecl _open_osfhandle(intptr_t,int);
 int         __cdecl _pipe(int*,unsigned int,int);




More information about the wine-cvs mailing list