summaryrefslogtreecommitdiffstats
path: root/src/datagen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/datagen.c')
-rw-r--r--src/datagen.c35
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;
}