pud: nmealib: replace random() by our own function
[olsrd.git] / lib / pud / nmealib / src / random.h
1 #ifndef _NMEA_RANDOM_H
2 #define _NMEA_RANDOM_H
3
4 #include <fcntl.h>
5 #include <unistd.h>
6 #include <stdint.h>
7 #include <stdlib.h>
8
9 #define NMEA_RANDOM_MAX INT32_MAX
10
11 static inline long int nmea_random(const double min, const double max) {
12   int32_t value;
13   double range = abs(max - min);
14
15 #ifdef _WIN32
16   value = random();
17 #else
18   int randomFile = open("/dev/urandom", O_RDONLY);
19   if (randomFile == -1) {
20     randomFile = open("/dev/random", O_RDONLY);
21   }
22
23   if ((randomFile == -1) || (read(randomFile, &value, sizeof(value)) != sizeof(value))) {
24     value = random();
25   }
26   close(randomFile);
27 #endif /* _WIN32 */
28
29   return min + ((abs(value) * range) / NMEA_RANDOM_MAX);
30 }
31
32 static inline void nmea_init_random(void) {
33 #ifdef _WIN32
34   srandom(time(NULL));
35   return;
36 #endif /* _WIN32 */
37
38   srandom(nmea_random(0, NMEA_RANDOM_MAX));
39 }
40
41 #endif /* _NMEA_RANDOM_H */