From 96c31b26181a194d24da9e7f89671ffa1e9d92db Mon Sep 17 00:00:00 2001 From: "Andrey A. Chernov" Date: Sat, 14 Jun 1997 00:14:29 +0000 Subject: [PATCH] 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. --- include/stdlib.h | 2 +- lib/libc/stdlib/random.3 | 7 +------ lib/libc/stdlib/random.c | 25 ++++++++++++++++--------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/include/stdlib.h b/include/stdlib.h index 4b4c12ee71b7..3f574788fb08 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 21950846d47d..469149824060 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 965142cc46d9..2c4e2347cbde 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 /* for srandomdev() */ #include /* for srandomdev() */ #include #include @@ -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; } /*