olsr_random: introduce better random functions
authorFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 26 Feb 2015 10:27:03 +0000 (11:27 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 26 Feb 2015 10:27:56 +0000 (11:27 +0100)
These new function read /dev/urandom (or /dev/random as a fallback)
on platforms that support those devices. They invoke random() on
other platforms.

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/olsr_random.h [new file with mode: 0644]

diff --git a/src/olsr_random.h b/src/olsr_random.h
new file mode 100644 (file)
index 0000000..c01e382
--- /dev/null
@@ -0,0 +1,38 @@
+#ifndef _OLSR_RANDOM_H
+#define _OLSR_RANDOM_H
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define OLSR_RANDOM_MAX INT32_MAX
+
+static inline long int olsr_random(void) {
+#ifdef _WIN32
+  return random();
+#endif /* _WIN32 */
+
+  int32_t value;
+  int randomFile = open("/dev/urandom", O_RDONLY);
+
+  if (randomFile == -1) {
+    randomFile = open("/dev/random", O_RDONLY);
+  }
+
+  if ((randomFile == -1) || (read(randomFile, &value, sizeof(value)) != sizeof(value))) {
+    value = random();
+  }
+
+  if (randomFile != -1) {
+    close(randomFile);
+  }
+
+  return abs(value);
+}
+
+static inline void olsr_init_random(void) {
+  srandom(time(NULL));
+}
+
+#endif /* _OLSR_RANDOM_H */