From fd853e34e2dbfe51b00c9f69335b103f1c1fdab2 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Thu, 19 Sep 2024 20:31:16 +0200 Subject: misc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- rnd.c | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) (limited to 'rnd.c') diff --git a/rnd.c b/rnd.c index 7e24bf2..0ed92e2 100644 --- a/rnd.c +++ b/rnd.c @@ -2,30 +2,32 @@ #include "common.h" -static char reservoir[128U << 10]; -static size_t reservoir_off = sizeof(reservoir); +static char *reservoir; +static size_t reservoir_off; +static size_t reservoir_size; static int random_fd; static const char *random_fname; -size_t -max_blksize(void) -{ - size_t ret = sizeof(reservoir); - while (ret & (ret - 1U)) - ret &= ret - 1U; - return ret; -} - - void -init_random(int fd, const char *fname) +init_random(int fd, const char *fname, off_t blksize) { struct stat st; + if (blksize <= 0) { + blksize = (off_t)64 << 20; + } else if (blksize > (off_t)1 << 30) { + weprintf("limiting block size to 1G"); + blksize = 1; + blksize <<= 30; + } + random_fname = fname; random_fd = fd; + reservoir_size = (size_t)blksize; + reservoir = emalloc(reservoir_size); + errno = 0; if (isatty(random_fd) || errno == EBADF) { use_builtin_generator: @@ -41,13 +43,27 @@ init_random(int fd, const char *fname) } +void +destroy_random(void) +{ + free(reservoir); +} + + +size_t +max_blksize(void) +{ + return reservoir_size; +} + + const char * get_random(size_t needed) { size_t off; ssize_t r; - if (sizeof(reservoir) - reservoir_off >= needed) + if (reservoir_size - reservoir_off >= needed) return &reservoir[reservoir_off]; if (random_fd < 0) { -- cgit v1.2.3-70-g09d2