diff options
Diffstat (limited to 'src/datagen.c')
-rw-r--r-- | src/datagen.c | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/src/datagen.c b/src/datagen.c index 25002e2..7eab23f 100644 --- a/src/datagen.c +++ b/src/datagen.c @@ -6,37 +6,36 @@ #include <stddef.h> #include <errno.h> #include <stdlib.h> +#include <string.h> #include <sys/types.h> #include "datagen.h" #include "defs.h" -int gen_get_array(struct stream * const in, ssize_t idx, struct entry_l * const data) -{ - int ret = 0; - (void) idx; +static struct entry_l buf; - in->prev_idx = -1; - ret = read(in->fd, &data->val, sizeof(data->val)); +struct entry_l *gen_get_array(struct stream * const in) +{ + struct entry_l *ret; + int errn; - if (ret != sizeof(data->val)) { - ret = ret > 0 ? EAGAIN : errno; + if (read(in->fd, &buf.val, sizeof(buf.val)) == sizeof(buf.val)) { + ret = &buf; + } else { + errn = errno; + ret = NULL; + rin_err("error reading /dev/urandom: %s", strerror(errn)); } return ret; } -int gen_get_list(struct stream * const restrict in, ssize_t idx, struct entry_l * const data) +struct entry_l *gen_get_list(struct stream * const in) { - int ret = 0; + struct entry_l *ret; - data->prev = idx > 0 ? idx - 1 : labs(idx) - 1; - data->next = idx + 1; - - if (!idx) { - data->val = 0; /* header lmao */ - } else { - ret = gen_get_array(in, idx, data); - } + try_s((ret = gen_get_array(in)), err); + ret->next = 0; +err: return ret; } |