Module: wine Branch: master Commit: 841fc1805e4032af79acacfda6ccb010884c5a94 URL: http://source.winehq.org/git/wine.git/?a=commit;h=841fc1805e4032af79acacfda6...
Author: Andrew Nguyen arethusa26@gmail.com Date: Fri Jan 15 11:02:56 2010 -0600
msvcrt: Implement and test rand_s.
---
dlls/msvcrt/Makefile.in | 2 +- dlls/msvcrt/misc.c | 14 ++++++++++ dlls/msvcrt/msvcrt.spec | 1 + dlls/msvcrt/tests/Makefile.in | 1 + dlls/msvcrt/tests/misc.c | 58 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 1 deletions(-)
diff --git a/dlls/msvcrt/Makefile.in b/dlls/msvcrt/Makefile.in index 7c2b25e..e5f6910 100644 --- a/dlls/msvcrt/Makefile.in +++ b/dlls/msvcrt/Makefile.in @@ -6,7 +6,7 @@ VPATH = @srcdir@ MODULE = msvcrt.dll IMPORTLIB = msvcrt IMPORTS = kernel32 ntdll -DELAYIMPORTS = user32 +DELAYIMPORTS = advapi32 user32
C_SRCS = \ console.c \ diff --git a/dlls/msvcrt/misc.c b/dlls/msvcrt/misc.c index 082c38b..c345589 100644 --- a/dlls/msvcrt/misc.c +++ b/dlls/msvcrt/misc.c @@ -25,6 +25,7 @@
#include "msvcrt.h" #include "wine/debug.h" +#include "ntsecapi.h"
WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
@@ -61,6 +62,19 @@ int CDECL MSVCRT_rand(void) }
/********************************************************************* + * rand_s (MSVCRT.@) + */ +int CDECL MSVCRT_rand_s(unsigned int *pval) +{ + if (!pval || !RtlGenRandom(pval, sizeof(*pval))) + { + *MSVCRT__errno() = MSVCRT_EINVAL; + return MSVCRT_EINVAL; + } + return 0; +} + +/********************************************************************* * _sleep (MSVCRT.@) */ void CDECL MSVCRT__sleep(MSVCRT_ulong timeout) diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index ff7d971..2b3d22c 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -736,6 +736,7 @@ @ cdecl qsort(ptr long long ptr) ntdll.qsort @ cdecl raise(long) MSVCRT_raise @ cdecl rand() MSVCRT_rand +@ cdecl rand_s(ptr) MSVCRT_rand_s @ cdecl realloc(ptr long) MSVCRT_realloc @ cdecl remove(str) MSVCRT_remove @ cdecl rename(str str) MSVCRT_rename diff --git a/dlls/msvcrt/tests/Makefile.in b/dlls/msvcrt/tests/Makefile.in index d0486d1..c964427 100644 --- a/dlls/msvcrt/tests/Makefile.in +++ b/dlls/msvcrt/tests/Makefile.in @@ -16,6 +16,7 @@ CTESTS = \ file.c \ headers.c \ heap.c \ + misc.c \ printf.c \ scanf.c \ signal.c \ diff --git a/dlls/msvcrt/tests/misc.c b/dlls/msvcrt/tests/misc.c new file mode 100644 index 0000000..1f069fa --- /dev/null +++ b/dlls/msvcrt/tests/misc.c @@ -0,0 +1,58 @@ +/* + * Unit tests for miscellaneous msvcrt functions + * + * Copyright 2010 Andrew Nguyen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wine/test.h" +#include <errno.h> + +static int (__cdecl *prand_s)(unsigned int *); + +static void init(void) +{ + HMODULE hmod = GetModuleHandleA("msvcrt.dll"); + + prand_s = (void *)GetProcAddress(hmod, "rand_s"); +} + +static void test_rand_s(void) +{ + int ret; + unsigned int rand; + + if (!prand_s) + { + win_skip("rand_s is not available\n"); + return; + } + + errno = EBADF; + ret = prand_s(NULL); + ok(ret == EINVAL, "Expected rand_s to return EINVAL, got %d\n", ret); + ok(errno == EINVAL, "Expected errno to return EINVAL, got %d\n", errno); + + ret = prand_s(&rand); + ok(ret == 0, "Expected rand_s to return 0, got %d\n", ret); +} + +START_TEST(misc) +{ + init(); + + test_rand_s(); +}