aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib9/truerand.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/lib9/truerand.c b/src/lib9/truerand.c
new file mode 100644
index 00000000..aaf10f0a
--- /dev/null
+++ b/src/lib9/truerand.c
@@ -0,0 +1,21 @@
+#include <u.h>
+#include <libc.h>
+
+ulong
+truerand(void)
+{
+ int i, n;
+ uchar buf[sizeof(ulong)];
+ static int randfd = -1;
+
+ if(randfd < 0){
+ randfd = open("/dev/random", OREAD);
+ fcntl(randfd, F_SETFD, FD_CLOEXEC);
+ }
+ if(randfd < 0)
+ sysfatal("can't open /dev/random: %r");
+ for(i=0; i<sizeof(buf); i += n)
+ if((n = readn(randfd, buf+i, sizeof(buf)-i)) < 0)
+ sysfatal("can't read /dev/random: %r");
+ return *((ulong*)buf);
+}