main: improve random number generator seed
authorFerry Huberts <ferry.huberts@pelagic.nl>
Sat, 10 Nov 2012 10:44:12 +0000 (11:44 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Sat, 10 Nov 2012 10:49:10 +0000 (11:49 +0100)
Make it much more random when /dev/random or /dev/urandom is
available.

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/main.c

index ae38439..382c5dc 100644 (file)
@@ -230,6 +230,28 @@ olsrmain_load_config(char *file) {
   return 0;
 }
 
+static void initRandom(void) {
+  unsigned int seed = (unsigned int)time(NULL);
+
+#ifndef _WIN32
+  int randomFile;
+
+  randomFile = open("/dev/random", O_RDONLY);
+  if (randomFile == -1) {
+    randomFile = open("/dev/urandom", O_RDONLY);
+  }
+
+  if (randomFile != -1) {
+    if (read(randomFile, &seed, sizeof(seed)) != sizeof(seed)) {
+      ; /* to fix an 'unused result' compiler warning */
+    }
+    close(randomFile);
+  }
+#endif /* _WIN32 */
+
+  srandom(seed);
+}
+
 /**
  * Main entrypoint
  */
@@ -297,7 +319,7 @@ int main(int argc, char *argv[]) {
   olsr_openlog("olsrd");
 
   /* setup random seed */
-  srandom(time(NULL));
+  initRandom();
 
   /* Init widely used statics */
   memset(&all_zero, 0, sizeof(union olsr_ip_addr));