diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2015-09-17 01:04:49 +0300 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2015-09-17 01:04:49 +0300 |
| commit | 396a8ad5b3291776d455a10ebb4951904dbe01bd (patch) | |
| tree | ee80bddfa4589b7f362b4b1a4c6f0ab3336d4e29 /randgen_unix.c | |
| download | diceware-396a8ad5b3291776d455a10ebb4951904dbe01bd.tar.gz diceware-396a8ad5b3291776d455a10ebb4951904dbe01bd.zip | |
initial commit
Diffstat (limited to 'randgen_unix.c')
| -rw-r--r-- | randgen_unix.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/randgen_unix.c b/randgen_unix.c new file mode 100644 index 0000000..f7d12bb --- /dev/null +++ b/randgen_unix.c @@ -0,0 +1,42 @@ +#include "randgen.h" + +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <assert.h> + +struct randgen *randgen_open(const char *device) +{ + const char *filename = "/dev/urandom"; + FILE *fp; + + if (device) + filename = device; + + if ((fp = fopen(filename, "r")) == NULL) + { + fprintf(stderr, "failed to open random generator (%s): %s\n", filename, strerror(errno)); + return NULL; + } + + return (struct randgen *) fp; +} + +int randgen_close(struct randgen *randgen) +{ + assert(randgen != NULL); + fclose((FILE *) randgen); + return 0; +} + +int randgen_generate(struct randgen *randgen, void *buf, size_t size) +{ + assert(randgen != NULL); + assert(buf != NULL); + assert(size > 0); + + if (fread(buf, 1, size, (FILE *) randgen) != size) + return -1; + + return 0; +} |
