added some code
[NextIRCd.git] / src / tools.c
index acf4504f215fb429798924b5db8364a7b3698861..3fa6706148932740bd28b52a2cfca3707bd83040 100644 (file)
 #include <ctype.h>
 #include "tools.h"
 
+#ifdef WIN32
+#include <windows.h>
+#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);
+}
+