aboutsummaryrefslogtreecommitdiff
path: root/randgen_unix.c
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2015-09-17 01:04:49 +0300
committerOskari Timperi <oskari.timperi@iki.fi>2015-09-17 01:04:49 +0300
commit396a8ad5b3291776d455a10ebb4951904dbe01bd (patch)
treeee80bddfa4589b7f362b4b1a4c6f0ab3336d4e29 /randgen_unix.c
downloaddiceware-396a8ad5b3291776d455a10ebb4951904dbe01bd.tar.gz
diceware-396a8ad5b3291776d455a10ebb4951904dbe01bd.zip
initial commit
Diffstat (limited to 'randgen_unix.c')
-rw-r--r--randgen_unix.c42
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;
+}