all: fixes resulting from building with clang
[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 #include <time.h>
9 #include <math.h>
10
11 #define NMEA_RANDOM_MAX INT32_MAX
12
13 static inline long int nmea_random(const double min, const double max) {
14   int32_t value;
15   int randomFile;
16   double range = fabs(max - min);
17
18 #ifdef _WIN32
19   value = random();
20 #else
21
22   randomFile = open("/dev/urandom", O_RDONLY);
23   if (randomFile == -1) {
24     randomFile = open("/dev/random", O_RDONLY);
25   }
26
27   if ((randomFile == -1) || (read(randomFile, &value, sizeof(value)) != sizeof(value))) {
28     value = random();
29   }
30
31   if (randomFile != -1) {
32     close(randomFile);
33   }
34 #endif /* _WIN32 */
35
36   return min + ((abs(value) * range) / NMEA_RANDOM_MAX);
37 }
38
39 static inline void nmea_init_random(void) {
40   srandom(time(NULL));
41 }
42
43 #endif /* _NMEA_RANDOM_H */