olsr_random: introduce better random functions
[olsrd.git] / src / olsr_random.h
1 #ifndef _OLSR_RANDOM_H
2 #define _OLSR_RANDOM_H
3
4 #include <fcntl.h>
5 #include <unistd.h>
6 #include <stdint.h>
7 #include <stdlib.h>
8
9 #define OLSR_RANDOM_MAX INT32_MAX
10
11 static inline long int olsr_random(void) {
12 #ifdef _WIN32
13   return random();
14 #endif /* _WIN32 */
15
16   int32_t value;
17   int randomFile = open("/dev/urandom", O_RDONLY);
18
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
27   if (randomFile != -1) {
28     close(randomFile);
29   }
30
31   return abs(value);
32 }
33
34 static inline void olsr_init_random(void) {
35   srandom(time(NULL));
36 }
37
38 #endif /* _OLSR_RANDOM_H */