#include #include #include #include #include #include #include #include "random.h" #define RAND_BUF_SIZE 1024 #define RND_DEV "/dev/urandom" unsigned 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])); index = 0; out: return get_random(); close(fd); }