From ad68c0bd3cbb5d55fc34ebf34d7587bc19db3cff Mon Sep 17 00:00:00 2001 From: Andrew Nguyen Date: Tue, 28 Sep 2010 03:48:52 -0500 Subject: [PATCH] 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 b76f19b432..4c444026cf 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 5d47caae7f..3703af5666 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 78152d226f..78ff6620d5 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 b3f506b7f8..1c369af12c 100644 --- a/dlls/msvcrt/errno.c +++ b/dlls/msvcrt/errno.c @@ -227,6 +227,15 @@ int CDECL _get_doserrno(int *pValue) return 0; } +/********************************************************************* + * _set_errno (MSVCRT.@) + */ +int CDECL _set_errno(int value) +{ + *MSVCRT__errno() = value; + return 0; +} + /********************************************************************* * strerror (MSVCRT.@) */ diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 4cb882b17a..8c2626de7a 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 6ad8e5958e..620f09e3fd 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 707d3908c9..1331ac57ac 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); -- 2.32.0.93.g670b81a890