summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1997-06-14 00:14:29 +0000
committerache <ache@FreeBSD.org>1997-06-14 00:14:29 +0000
commit98ddc15c28ed1a38237156f5d5c73c6ddecf0ec9 (patch)
tree2103ee8dd8d4d042d62af7d59cb5b43245862624 /lib
parentf0711d970f9e49e9bc86224544dbf59e22c16000 (diff)
downloadFreeBSD-src-98ddc15c28ed1a38237156f5d5c73c6ddecf0ec9.zip
FreeBSD-src-98ddc15c28ed1a38237156f5d5c73c6ddecf0ec9.tar.gz
Instead of copying fallback code over and over in each program,
implement (better) falback code inside srandomdev() itself. Change return type from int to void (binary compatibility surprisely achieved). Userland code will be changed soon.
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/stdlib/random.37
-rw-r--r--lib/libc/stdlib/random.c25
2 files changed, 17 insertions, 15 deletions
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