]> git.itanic.dy.fi Git - sudoku/blob - random.cpp
random.cpp: Return better random numbers
[sudoku] / random.cpp
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                 return -1;
29         }
30
31         do {
32                 ret = read(fd, rndbuf + i,
33                           RAND_BUF_SIZE * (sizeof(rndbuf[0]) - i));
34                 
35                 if (ret <= 0) {
36                         error = errno;
37                         fprintf(stderr, "Error reading file %s: %s\n",
38                                 RND_DEV, strerror(error));
39                         goto out;
40                 }
41
42                 i += ret;
43         } while (i < RAND_BUF_SIZE * sizeof(rndbuf[0]));
44         index = 0;
45  out:
46         return get_random();
47         close(fd);
48 }