X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsn_random.c;h=bd4701bf5853137b1c92d650a1bbf6ecb19e6fe8;hb=0fc40afb5a375236b6d7af3f27b27b21c89c9779;hp=17bb6e9c4bb1325a937adbac44394e0d24a6dc02;hpb=b1632a807fc2166da35bb6b59d60738d4db24627;p=sort-networks.git diff --git a/src/sn_random.c b/src/sn_random.c index 17bb6e9..bd4701b 100644 --- a/src/sn_random.c +++ b/src/sn_random.c @@ -40,7 +40,8 @@ #include "sn_random.h" static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; -static unsigned int seed; +static unsigned int seed0; +static unsigned int seed1; static int have_init = 0; static int read_dev_random (void *buffer, size_t buffer_size) @@ -51,7 +52,7 @@ static int read_dev_random (void *buffer, size_t buffer_size) char *buffer_position; size_t yet_to_read; - fd = open ("/dev/random", O_RDONLY); + fd = open ("/dev/urandom", O_RDONLY); if (fd < 0) { perror ("open"); @@ -86,27 +87,37 @@ static int read_dev_random (void *buffer, size_t buffer_size) static void do_init (void) { - int status; + if (have_init) + return; - status = read_dev_random (&seed, sizeof (seed)); - if (status == 0) - have_init = 1; + read_dev_random (&seed0, sizeof (seed0)); + read_dev_random (&seed1, sizeof (seed1)); + have_init = 1; } /* void do_init */ +int sn_random_init (void) +{ + have_init = 0; + do_init (); + + return (0); +} + int sn_random (void) { - int ret; + int r0; + int r1; pthread_mutex_lock (&lock); - if (have_init == 0) - do_init (); + do_init (); - ret = rand_r (&seed); + r0 = rand_r (&seed0); + r1 = rand_r (&seed1); pthread_mutex_unlock (&lock); - return (ret); + return (r0 ^ r1); } /* int sn_random */ int sn_true_random (void)