]> git.itanic.dy.fi Git - sdl-planets/blob - random.c
Makefile: Better output beautifier
[sdl-planets] / random.c
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5 #include <errno.h>
6 #include <string.h>
7 #include <unistd.h>
8
9 #include "random.h"
10
11 #define RAND_BUF_SIZE   1024
12 #define RND_DEV         "/dev/urandom"
13
14 unsigned int get_random(void)
15 {
16         static int rndbuf[RAND_BUF_SIZE];
17         static int index = RAND_BUF_SIZE;
18         int fd, error, i = 0, ret;
19
20         if (index < RAND_BUF_SIZE)
21                 return rndbuf[index++];
22
23         fd = open(RND_DEV, O_RDONLY);
24         if (fd < 0) {
25                 error = errno;
26                 fprintf(stderr, "Error opening file %s: %s\n",
27                         RND_DEV, strerror(error));
28                 ret = error;
29                 goto err;
30         }
31
32         do {
33                 ret = read(fd, rndbuf + i,
34                           RAND_BUF_SIZE * (sizeof(rndbuf[0]) - i));
35
36                 if (ret <= 0) {
37                         error = errno;
38                         fprintf(stderr, "Error reading file %s: %s\n",
39                                 RND_DEV, strerror(error));
40                         ret = error;
41                         goto err;
42                 }
43
44                 i += ret;
45         } while (i < RAND_BUF_SIZE * sizeof(rndbuf[0]));
46         index = 0;
47
48         close(fd);
49         return get_random();
50
51 err:
52         close(fd);
53         return ret;
54 }
55
56 double get_random_double(void)
57 {
58         return get_random() / (double)((unsigned int)(-1));
59 }