From bf42505b7b32400bfdc183fb5f1588394e6417dc Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Thu, 18 Aug 2011 18:03:06 +0900 Subject: MinGW32: Use CryptGenRandom() to generate random number. MinGW32 lacks random(), so we use CryptGenRandom() as a replacement. In the implementation, SimpleRandomizer::getRandomNumber() returns the random number in range [0, INT32_MAX]. Thus, simpleRandomizer::getMaxRandomNumber() returns INT32_MAX. --- src/SimpleRandomizer.cc | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) (limited to 'src/SimpleRandomizer.cc') diff --git a/src/SimpleRandomizer.cc b/src/SimpleRandomizer.cc index 53111db6..48a46b96 100644 --- a/src/SimpleRandomizer.cc +++ b/src/SimpleRandomizer.cc @@ -33,11 +33,13 @@ */ /* copyright --> */ #include "SimpleRandomizer.h" -#include "a2time.h" + #include #include #include +#include "a2time.h" + namespace aria2 { SharedHandle SimpleRandomizer::randomizer_; @@ -52,25 +54,57 @@ const SharedHandle& SimpleRandomizer::getInstance() void SimpleRandomizer::init() { +#ifndef __MINGW32__ srandom(time(0)^getpid()); +#endif // !__MINGW32__ } -SimpleRandomizer::SimpleRandomizer() {} +SimpleRandomizer::SimpleRandomizer() +{ +#ifdef __MINGW32__ + BOOL r = CryptAcquireContext(&cryProvider_, 0, 0, PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT|CRYPT_SILENT); + assert(r); +#endif // __MINGW32__ +} -SimpleRandomizer::~SimpleRandomizer() {} +SimpleRandomizer::~SimpleRandomizer() +{ +#ifdef __MINGW32__ + CryptReleaseContext(cryProvider_, 0); +#endif // __MINGW32__ +} long int SimpleRandomizer::getRandomNumber() { +#ifdef __MINGW32__ + int32_t val; + BOOL r = CryptGenRandom(cryProvider_, sizeof(val), + reinterpret_cast(&val)); + assert(r); + if(val == INT32_MIN) { + val = INT32_MAX; + } else if(val < 0) { + val = -val; + } + return val; +#else // !__MINGW32__ return random(); +#endif // !__MINGW32__ } long int SimpleRandomizer::getMaxRandomNumber() { +#ifdef __MINGW32__ + return INT32_MAX; +#else // !__MINGW32__ return RAND_MAX; +#endif // !__MINGW32__ } long int SimpleRandomizer::getRandomNumber(long int to) { + return(long int)(((double)to)*getRandomNumber()/(getMaxRandomNumber()+1.0)); } -- cgit