X-Git-Url: http://git.pk910.de/?p=NextIRCd.git;a=blobdiff_plain;f=src%2Ftools.c;h=3fa6706148932740bd28b52a2cfca3707bd83040;hp=acf4504f215fb429798924b5db8364a7b3698861;hb=4ec553e7da1550129721795a95d9cfaa4166d28d;hpb=93a69acc63c1e367e2cdbea1e60dc34884ec69e4 diff --git a/src/tools.c b/src/tools.c index acf4504..3fa6706 100644 --- a/src/tools.c +++ b/src/tools.c @@ -19,6 +19,10 @@ #include #include "tools.h" +#ifdef WIN32 +#include +#endif + int stricmp (const char *s1, const char *s2) { return stricmplen(s1, s2, -1); } @@ -110,3 +114,71 @@ int match(const char *mask, const char *name) break; } } + + +static unsigned char random_numbers[256]; +static int random_numbers_available = 0; + +int get_random(int min, int max) { + int requested_bytes = 0; + unsigned int rnd_width = max-min; + if((rnd_width % (0xFF000000))) + requested_bytes = 4; + else if((rnd_width % (0xFF0000))) + requested_bytes = 3; + else if((rnd_width % (0xFF00))) + requested_bytes = 2; + else + requested_bytes = 1; + + //get_random_generate: + + if(random_numbers_available < requested_bytes) { + // generate new random numbers + #ifdef WIN32 + HMODULE hLib=LoadLibrary("ADVAPI32.DLL"); + if (hLib) { + BOOLEAN (APIENTRY *pfn)(void*, ULONG) = (BOOLEAN (APIENTRY *)(void*,ULONG))GetProcAddress(hLib,"SystemFunction036"); + if(pfn) { + ULONG ulCbBuff = sizeof(random_numbers) - random_numbers_available; + if(pfn(random_numbers + random_numbers_available,ulCbBuff)) { + random_numbers_available += ulCbBuff; + } + } + FreeLibrary(hLib); + } + #else + int randomData = open("/dev/random", O_RDONLY); + int randLen = sizeof(random_numbers) - random_numbers_available; + size_t randomDataLen = random_numbers_available; + while (randomDataLen < randLen) { + ssize_t result = read(randomData, ((char*)random_numbers) + randomDataLen, randLen - randomDataLen); + if (result < 0) + break; + randomDataLen += result; + } + random_numbers_available = randomDataLen; + close(randomData); + #endif + + if(random_numbers_available < requested_bytes) { + //system random number generators failed! + + } + } + + int rnd = 0; + int i = 0; + do { + if(i) + rnd <<= 8; + rnd |= random_numbers[--random_numbers_available]; + } while(++i < requested_bytes); + + // TODO: find better solution for this + //if((rnd % rnd_width) > rnd_width) + // goto get_random_generate; + + return min + (rnd % rnd_width); +} +