pud: nmealib: replace random() by our own function
authorFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 26 Feb 2015 00:19:30 +0000 (01:19 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 26 Feb 2015 10:27:56 +0000 (11:27 +0100)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/pud/nmealib/src/generator.c
lib/pud/nmealib/src/random.h [new file with mode: 0644]

index c9c5aac..26edd3a 100644 (file)
 #include <nmea/gmath.h>
 #include <nmea/generate.h>
 
+#include "random.h"
+
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
 
 /**
- * Generate a random number in the range [min, max]
- *
- * @param min the minimum
- * @param max the maximum
- * @return a random number
- */
-static double nmea_random(const double min, const double max) {
-       static double rand_max = RAND_MAX;
-       double rand_val = rand();
-       double bounds = max - min;
-       return min + (rand_val * bounds) / rand_max;
-}
-
-/**
  * Initialise the generator
  *
  * @param gen a pointer to the generator
@@ -53,6 +41,8 @@ int nmea_gen_init(nmeaGENERATOR *gen, nmeaINFO *info) {
        int smask = info->smask;
        nmeaGENERATOR *igen = gen;
 
+       nmea_init_random();
+
        nmea_zero_INFO(info);
        info->present = present;
        info->smask = smask;
diff --git a/lib/pud/nmealib/src/random.h b/lib/pud/nmealib/src/random.h
new file mode 100644 (file)
index 0000000..32b2b69
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef _NMEA_RANDOM_H
+#define _NMEA_RANDOM_H
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define NMEA_RANDOM_MAX INT32_MAX
+
+static inline long int nmea_random(const double min, const double max) {
+  int32_t value;
+  double range = abs(max - min);
+
+#ifdef _WIN32
+  value = random();
+#else
+  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();
+  }
+  close(randomFile);
+#endif /* _WIN32 */
+
+  return min + ((abs(value) * range) / NMEA_RANDOM_MAX);
+}
+
+static inline void nmea_init_random(void) {
+#ifdef _WIN32
+  srandom(time(NULL));
+  return;
+#endif /* _WIN32 */
+
+  srandom(nmea_random(0, NMEA_RANDOM_MAX));
+}
+
+#endif /* _NMEA_RANDOM_H */