summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGuillem Jover <guillem@hadrons.org>2008-06-18 08:44:18 +0300
committerGuillem Jover <guillem@hadrons.org>2008-06-18 08:44:18 +0300
commitbf4eeb29f049e374b33b788a8df02357d659183c (patch)
tree38f2c81448e5c8e9fabc5cde2fa5d4d7dc48d245 /src
parent26ab4750eebff515ca5717ee272a79fa3866ab55 (diff)
downloadlibbsd-bf4eeb29f049e374b33b788a8df02357d659183c.tar.gz
Add arc4random_stir and arc4random_addrandom functions
Diffstat (limited to 'src')
-rw-r--r--src/arc4random.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/arc4random.c b/src/arc4random.c
index 22dae59..5c1837e 100644
--- a/src/arc4random.c
+++ b/src/arc4random.c
@@ -31,6 +31,7 @@ __FBSDID("$FreeBSD: src/lib/libc/gen/arc4random.c,v 1.10 2004/03/24 14:44:57 gre
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
+#include <pthread.h>
struct arc4_stream {
u_int8_t i;
@@ -39,8 +40,14 @@ struct arc4_stream {
};
#define RANDOMDEV "/dev/urandom"
+#ifdef __REENTRANT
+static pthread_mutex_t arc4random_mtx = PTHREAD_MUTEX_INITIALIZER;
+#define THREAD_LOCK() pthread_mutex_lock(&arc4random_mtx)
+#define THREAD_UNLOCK() pthread_mutex_unlock(&arc4random_mtx)
+#else
#define THREAD_LOCK()
#define THREAD_UNLOCK()
+#endif
static struct arc4_stream rs;
static int rs_initialized;
@@ -155,6 +162,27 @@ arc4_check_stir(void)
}
}
+void
+arc4random_stir()
+{
+ THREAD_LOCK();
+ arc4_check_init();
+ arc4_stir(&rs);
+ THREAD_UNLOCK();
+}
+
+void
+arc4random_addrandom(dat, datlen)
+ u_char *dat;
+ int datlen;
+{
+ THREAD_LOCK();
+ arc4_check_init();
+ arc4_check_stir();
+ arc4_addrandom(&rs, dat, datlen);
+ THREAD_UNLOCK();
+}
+
u_int32_t
arc4random()
{