summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/stdlib.h2
-rw-r--r--lib/libc/stdlib/random.37
-rw-r--r--lib/libc/stdlib/random.c25
3 files changed, 18 insertions, 16 deletions
diff --git a/include/stdlib.h b/include/stdlib.h
index 4b4c12e..3f57478 100644
--- a/include/stdlib.h
+++ b/include/stdlib.h
@@ -160,7 +160,7 @@ long random __P((void));
char *realpath __P((const char *, char resolved_path[]));
char *setstate __P((char *));
void srandom __P((unsigned long));
-int srandomdev __P((void));
+void srandomdev __P((void));
char *user_from_uid __P((unsigned long, int));
#ifndef __STRICT_ANSI__
long long
diff --git a/lib/libc/stdlib/random.3 b/lib/libc/stdlib/random.3
index 2195084..4691498 100644
--- a/lib/libc/stdlib/random.3
+++ b/lib/libc/stdlib/random.3
@@ -47,7 +47,7 @@
.Fn random void
.Ft void
.Fn srandom "unsigned long seed"
-.Ft int
+.Ft void
.Fn srandomdev void
.Ft char *
.Fn initstate "unsigned long seed" "char *state" "long n"
@@ -108,11 +108,6 @@ calling
with any value, since the succeeding terms in the
state buffer are no longer derived from the LC algorithm applied to
a fixed seed.
-If successful
-.Fn srandomdev
-returns 0. It returns -1 on failure, and sets
-.Va errno
-to indicate the error.
.Pp
The
.Fn initstate
diff --git a/lib/libc/stdlib/random.c b/lib/libc/stdlib/random.c
index 965142c..2c4e234 100644
--- a/lib/libc/stdlib/random.c
+++ b/lib/libc/stdlib/random.c
@@ -30,7 +30,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id$
+ * $Id: random.c,v 1.8 1997/03/29 19:55:03 ache Exp $
*
*/
@@ -38,6 +38,7 @@
static char sccsid[] = "@(#)random.c 8.2 (Berkeley) 5/19/95";
#endif /* LIBC_SCCS and not lint */
+#include <sys/time.h> /* for srandomdev() */
#include <fcntl.h> /* for srandomdev() */
#include <stdio.h>
#include <stdlib.h>
@@ -285,10 +286,10 @@ srandom(x)
* state buffer are no longer derived from the LC algorithm applied to
* a fixed seed.
*/
-int
+void
srandomdev()
{
- int fd;
+ int fd, done;
size_t len;
if (rand_type == TYPE_0)
@@ -296,20 +297,26 @@ srandomdev()
else
len = rand_deg * sizeof state[0];
+ done = 0;
fd = open("/dev/urandom", O_RDONLY, 0);
- if (fd < 0)
- return -1;
- if (read(fd, (void *) state, len) < (ssize_t) len) {
+ if (fd >= 0) {
+ if (read(fd, (void *) state, len) == (ssize_t) len)
+ done = 1;
close(fd);
- return -1;
}
- close(fd);
+
+ if (!done) {
+ struct timeval tv;
+
+ gettimeofday(&tv, NULL);
+ srandom(getpid() ^ tv.tv_sec ^ tv.tv_usec);
+ return;
+ }
if (rand_type != TYPE_0) {
fptr = &state[rand_sep];
rptr = &state[0];
}
- return 0;
}
/*
OpenPOWER on IntegriCloud