Module: wine Branch: master Commit: 7d41f9b3e90943f2112bd986ec5f70781af3125c URL: http://source.winehq.org/git/wine.git/?a=commit;h=7d41f9b3e90943f2112bd986ec...
Author: Piotr Caban piotr@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);