diff options
| author | EuAndreh <eu@euandre.org> | 2025-01-12 00:14:03 -0300 |
|---|---|---|
| committer | EuAndreh <eu@euandre.org> | 2025-01-12 14:27:57 -0300 |
| commit | 44d56f5311f98a8955c67638e7520963dbd4d845 (patch) | |
| tree | fbb2c58c79f1730ff62c83cef116fb5c0e035dfe /src/random.c | |
| parent | Replace src/config.h with <s.h>; incorporate changes from other projects (diff) | |
| download | pindaiba-44d56f5311f98a8955c67638e7520963dbd4d845.tar.gz pindaiba-44d56f5311f98a8955c67638e7520963dbd4d845.tar.xz | |
Revamp lib, simplify it a bit and address some FIXMEs
Diffstat (limited to '')
| -rw-r--r-- | src/random.c | 109 |
1 files changed, 16 insertions, 93 deletions
diff --git a/src/random.c b/src/random.c index b409e6a..0382b3e 100644 --- a/src/random.c +++ b/src/random.c @@ -1,141 +1,64 @@ -#include "config.h" +#include <s.h> #include <assert.h> #include <errno.h> -#include <stdint.h> #include <stdio.h> -#include <stdlib.h> #include <string.h> #include "logerr.h" -#include "util.h" #include "random.h" -struct Random { - FILE *const file_handle; -}; +static FILE * +FRANDOM = NULL; int -urandom_bytes(const size_t n, uint8_t (*const addr)[]) { +random_init(void) { int rc = -1; - uint8_t *ret = NULL; - FILE *f = NULL; - - ret = malloc(n); - if (ret == NULL) { - logerr("malloc(): %s", strerror(errno)); - goto out; - } - - f = fopen("/dev/urandom", "r"); - if (f == NULL) { + FRANDOM = fopen("/dev/urandom", "r"); + if (FRANDOM == NULL) { logerr("fopen(): %s", strerror(errno)); goto out; } - const size_t read_count = fread(ret, 1U, n, f); - if (ferror(f)) { - logerr("fread(): %s", strerror(errno)); - goto out; - } - assert(read_count == n); - - if (fclose(f)) { - logerr("fclose(): %s", strerror(errno)); - goto out; - } - f = NULL; - - memcpy(addr, ret, n); rc = 0; out: - if (f != NULL) { - if (fclose(f)) { - logerr("fclose(): %s", strerror(errno)); - rc = -1; - } - } - if (ret != NULL) { - freeit((void *)&ret); - } return rc; } int -random_generate( - const struct Random *const r, - const size_t length, - uint8_t (*const out)[] -) { +random_end(void) { int rc = -1; - const size_t read_count = fread(out, 1U, length, r->file_handle); - if (ferror(r->file_handle)) { - logerr("fread(): %s", strerror(errno)); + if (fclose(FRANDOM)) { + logerr("fclose(): %s", strerror(errno)); goto out; } - assert(read_count == length); rc = 0; out: + FRANDOM = NULL; return rc; } int -random_new(const struct Random **const out) { +random_bytes(const size_t length, u8 (*const out)[]) { int rc = -1; - const struct Random *ret = NULL; - FILE *f = NULL; - - ret = malloc(sizeof(*ret)); - if (ret == NULL) { - logerr("malloc(): %s", strerror(errno)); - goto out; - } - - f = fopen("/dev/urandom", "r"); - if (f == NULL) { - logerr("fopen(): %s", strerror(errno)); - goto out; - } - - memcpy((void *)ret, &(struct Random) { - .file_handle = f, - }, sizeof(*ret)); - *out = ret; - rc = 0; -out: - if (rc) { - random_free(&ret); - } - return rc; -} - -int -random_free(const struct Random **const r) { - if (r == NULL) { - return 0; - } - - if (*r == NULL) { - return 0; - } - - int rc = -1; - if (fclose((*r)->file_handle)) { - logerr("fclose(): %s", strerror(errno)); + assert(FRANDOM != NULL); + const size_t read_count = fread(out, 1U, length, FRANDOM); + if (ferror(FRANDOM)) { + logerr("fread(): %s", strerror(errno)); goto out; } + assert(read_count == length); rc = 0; out: - freeit((void *)r); return rc; } |
