]> git.itanic.dy.fi Git - sudoku/blobdiff - random.cpp
generator: Add some basic placeholders for having sudoku generator
[sudoku] / random.cpp
diff --git a/random.cpp b/random.cpp
new file mode 100644 (file)
index 0000000..62419c4
--- /dev/null
@@ -0,0 +1,46 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "random.h"
+
+#define RAND_BUF_SIZE  1024
+#define RND_DEV                "/dev/urandom"
+
+int get_random(void)
+{
+       static int rndbuf[RAND_BUF_SIZE];
+       static int index = RAND_BUF_SIZE;
+       int fd, error, i = 0, ret;
+
+       if (index < RAND_BUF_SIZE)
+               return rndbuf[index++];
+
+       fd = open(RND_DEV, O_RDONLY);
+       if (fd < 0) {
+               error = errno;
+               fprintf(stderr, "Error opening file %s: %s\n",
+                       RND_DEV, strerror(error));
+               return -1;
+       }
+
+       do {
+               ret = read(fd, rndbuf + i,
+                         RAND_BUF_SIZE * (sizeof(rndbuf[0]) - i));
+               
+               if (ret <= 0) {
+                       error = errno;
+                       fprintf(stderr, "Error reading file %s: %s\n",
+                               RND_DEV, strerror(error));
+                       goto out;
+               }
+
+               i += ret;
+       } while (i < RAND_BUF_SIZE * sizeof(rndbuf[0]));
+ out:
+       close(fd);
+}