Module: wine Branch: master Commit: 1b4bacea8c9b8bb4208cc5e91c473d595f7fbca4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1b4bacea8c9b8bb4208cc5e91c...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Apr 19 10:59:02 2010 +0200
msvcrt: Added fopen_s implementation.
---
dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/file.c | 30 +++++++++++++++++++++++++++++- dlls/msvcrt/msvcrt.spec | 2 +- 4 files changed, 32 insertions(+), 4 deletions(-)
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 04535b3..44507ec 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -1259,7 +1259,7 @@ @ cdecl floor(double) msvcrt.floor @ cdecl fmod(double double) msvcrt.fmod @ cdecl fopen(str str) msvcrt.fopen -@ stub fopen_s +@ cdecl fopen_s(ptr str str) msvcrt.fopen_s @ varargs fprintf(ptr str) msvcrt.fprintf @ stub fprintf_s @ cdecl fputc(long ptr) msvcrt.fputc diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index ae13be4..1e6731f 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -1243,7 +1243,7 @@ @ cdecl floor(double) msvcrt.floor @ cdecl fmod(double double) msvcrt.fmod @ cdecl fopen(str str) msvcrt.fopen -@ stub fopen_s +@ cdecl fopen_s(ptr str str) msvcrt.fopen_s @ varargs fprintf(ptr str) msvcrt.fprintf @ stub fprintf_s @ cdecl fputc(long ptr) msvcrt.fputc diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index c5b2798..6641999 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -218,6 +218,7 @@ static int msvcrt_alloc_fd_from(HANDLE hand, int flag, int fd) if (fd >= MSVCRT_MAX_FILES) { WARN(":files exhausted!\n"); + *MSVCRT__errno() = MSVCRT_ENFILE; return -1; } MSVCRT_fdesc[fd].handle = hand; @@ -1033,6 +1034,8 @@ static int msvcrt_get_flags(const MSVCRT_wchar_t* mode, int *open_flags, int* st *stream_flags = plus ? MSVCRT__IORW : MSVCRT__IOWRT; break; default: + MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0); + *MSVCRT__errno() = MSVCRT_EINVAL; return -1; }
@@ -2649,10 +2652,16 @@ MSVCRT_FILE * CDECL MSVCRT__fsopen(const char *path, const char *mode, int share MSVCRT_FILE *ret; MSVCRT_wchar_t *pathW = NULL, *modeW = NULL;
- if (path && !(pathW = msvcrt_wstrdupa(path))) return NULL; + if (path && !(pathW = msvcrt_wstrdupa(path))) { + MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0); + *MSVCRT__errno() = MSVCRT_EINVAL; + return NULL; + } if (mode && !(modeW = msvcrt_wstrdupa(mode))) { MSVCRT_free(pathW); + MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0); + *MSVCRT__errno() = MSVCRT_EINVAL; return NULL; }
@@ -2672,6 +2681,25 @@ MSVCRT_FILE * CDECL MSVCRT_fopen(const char *path, const char *mode) }
/********************************************************************* + * fopen_s (MSVCRT.@) + */ +int CDECL MSVCRT_fopen_s(MSVCRT_FILE** pFile, + const char *filename, const char *mode) +{ + if(!pFile) { + MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0); + *MSVCRT__errno() = MSVCRT_EINVAL; + return MSVCRT_EINVAL; + } + + *pFile = MSVCRT_fopen(filename, mode); + + if(!*pFile) + return *MSVCRT__errno(); + return 0; +} + +/********************************************************************* * _wfopen (MSVCRT.@) */ MSVCRT_FILE * CDECL MSVCRT__wfopen(const MSVCRT_wchar_t *path, const MSVCRT_wchar_t *mode) diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index f4f9ee8..fdd58c2 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -1190,7 +1190,7 @@ @ cdecl floor(double) MSVCRT_floor @ cdecl fmod(double double) MSVCRT_fmod @ cdecl fopen(str str) MSVCRT_fopen -# stub fopen_s +@ cdecl fopen_s(ptr str str) MSVCRT_fopen_s @ varargs fprintf(ptr str) MSVCRT_fprintf # stub fprintf_s @ cdecl fputc(long ptr) MSVCRT_fputc