Module: wine Branch: master Commit: ad68c0bd3cbb5d55fc34ebf34d7587bc19db3cff URL: http://source.winehq.org/git/wine.git/?a=commit;h=ad68c0bd3cbb5d55fc34ebf34d...
Author: Andrew Nguyen anguyen@codeweavers.com Date: Tue Sep 28 03:48:52 2010 -0500
msvcrt: Implement _set_errno.
---
dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/errno.c | 9 +++++++++ dlls/msvcrt/msvcrt.spec | 2 +- dlls/msvcrt/tests/misc.c | 29 +++++++++++++++++++++++++++++ include/msvcrt/stdlib.h | 1 + 7 files changed, 43 insertions(+), 4 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index b76f19b..4c44402 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1071,7 +1071,7 @@ @ stub _set_abort_behavior @ stub _set_controlfp @ stub _set_doserrno -@ stub _set_errno +@ cdecl _set_errno(long) msvcrt._set_errno @ cdecl _set_error_mode(long) msvcrt._set_error_mode @ stub _set_fmode @ cdecl _set_invalid_parameter_handler(ptr) msvcrt._set_invalid_parameter_handler diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 5d47caa..3703af5 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -924,7 +924,7 @@ @ stub _set_amblksiz @ stub _set_controlfp @ stub _set_doserrno -@ stub _set_errno +@ cdecl _set_errno(long) msvcrt._set_errno @ cdecl _set_error_mode(long) msvcrt._set_error_mode @ stub _set_fmode @ cdecl _set_invalid_parameter_handler(ptr) msvcrt._set_invalid_parameter_handler diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 78152d2..78ff662 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -910,7 +910,7 @@ @ stub _set_amblksiz @ stub _set_controlfp @ stub _set_doserrno -@ stub _set_errno +@ cdecl _set_errno(long) msvcrt._set_errno @ cdecl _set_error_mode(long) msvcrt._set_error_mode @ stub _set_fmode @ cdecl _set_invalid_parameter_handler(ptr) msvcrt._set_invalid_parameter_handler diff --git a/dlls/msvcrt/errno.c b/dlls/msvcrt/errno.c index b3f506b..1c369af 100644 --- a/dlls/msvcrt/errno.c +++ b/dlls/msvcrt/errno.c @@ -228,6 +228,15 @@ int CDECL _get_doserrno(int *pValue) }
/********************************************************************* + * _set_errno (MSVCRT.@) + */ +int CDECL _set_errno(int value) +{ + *MSVCRT__errno() = value; + return 0; +} + +/********************************************************************* * strerror (MSVCRT.@) */ char* CDECL MSVCRT_strerror(int err) diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 4cb882b..8c2626d 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -849,7 +849,7 @@ @ cdecl _set_SSE2_enable(long) MSVCRT__set_SSE2_enable # stub _set_controlfp # stub _set_doserrno -# stub _set_errno +@ cdecl _set_errno(long) @ cdecl _set_error_mode(long) # stub _set_fileinfo # stub _set_fmode diff --git a/dlls/msvcrt/tests/misc.c b/dlls/msvcrt/tests/misc.c index 6ad8e59..620f09e 100644 --- a/dlls/msvcrt/tests/misc.c +++ b/dlls/msvcrt/tests/misc.c @@ -28,6 +28,7 @@ static int (__cdecl *pI10_OUTPUT)(long double, int, int, void*); static int (__cdecl *pstrerror_s)(char *, MSVCRT_size_t, int); static int (__cdecl *p_get_doserrno)(int *); static int (__cdecl *p_get_errno)(int *); +static int (__cdecl *p_set_errno)(int);
static void init(void) { @@ -39,6 +40,7 @@ static void init(void) pstrerror_s = (void *)GetProcAddress(hmod, "strerror_s"); p_get_doserrno = (void *)GetProcAddress(hmod, "_get_doserrno"); p_get_errno = (void *)GetProcAddress(hmod, "_get_errno"); + p_set_errno = (void *)GetProcAddress(hmod, "_set_errno"); }
static void test_rand_s(void) @@ -292,6 +294,32 @@ static void test__get_errno(void) ok(out == EBADF, "Expected output variable to be EBADF, got %d\n", out); }
+static void test__set_errno(void) +{ + int ret; + + if (!p_set_errno) + { + win_skip("_set_errno is not available\n"); + return; + } + + errno = EBADF; + ret = p_set_errno(EINVAL); + ok(ret == 0, "Expected _set_errno to return 0, got %d\n", ret); + ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno); + + errno = EBADF; + ret = p_set_errno(-1); + ok(ret == 0, "Expected _set_errno to return 0, got %d\n", ret); + ok(errno == -1, "Expected errno to be -1, got %d\n", errno); + + errno = EBADF; + ret = p_set_errno(0xdeadbeef); + ok(ret == 0, "Expected _set_errno to return 0, got %d\n", ret); + ok(errno == 0xdeadbeef, "Expected errno to be 0xdeadbeef, got %d\n", errno); +} + START_TEST(misc) { init(); @@ -302,4 +330,5 @@ START_TEST(misc) test_strerror_s(); test__get_doserrno(); test__get_errno(); + test__set_errno(); } diff --git a/include/msvcrt/stdlib.h b/include/msvcrt/stdlib.h index 707d390..1331ac5 100644 --- a/include/msvcrt/stdlib.h +++ b/include/msvcrt/stdlib.h @@ -130,6 +130,7 @@ extern int* __cdecl _errno(void);
errno_t __cdecl _get_doserrno(int*); errno_t __cdecl _get_errno(int*); +errno_t __cdecl _set_errno(int);
typedef int (__cdecl *_onexit_t)(void);