diff options
Diffstat (limited to 'src/lib/libc/stdlib/random.c')
-rw-r--r-- | src/lib/libc/stdlib/random.c | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/src/lib/libc/stdlib/random.c b/src/lib/libc/stdlib/random.c index 79344f30f1..7c6e5f7eb9 100644 --- a/src/lib/libc/stdlib/random.c +++ b/src/lib/libc/stdlib/random.c | |||
@@ -32,11 +32,15 @@ | |||
32 | */ | 32 | */ |
33 | 33 | ||
34 | #if defined(LIBC_SCCS) && !defined(lint) | 34 | #if defined(LIBC_SCCS) && !defined(lint) |
35 | static char *rcsid = "$OpenBSD: random.c,v 1.6 1998/02/07 02:16:25 millert Exp $"; | 35 | static char *rcsid = "$OpenBSD: random.c,v 1.7 2000/04/03 23:23:48 millert Exp $"; |
36 | #endif /* LIBC_SCCS and not lint */ | 36 | #endif /* LIBC_SCCS and not lint */ |
37 | 37 | ||
38 | #include <sys/types.h> | ||
39 | #include <sys/time.h> | ||
40 | #include <fcntl.h> | ||
38 | #include <stdio.h> | 41 | #include <stdio.h> |
39 | #include <stdlib.h> | 42 | #include <stdlib.h> |
43 | #include <unistd.h> | ||
40 | 44 | ||
41 | /* | 45 | /* |
42 | * random.c: | 46 | * random.c: |
@@ -220,6 +224,47 @@ srandom(x) | |||
220 | } | 224 | } |
221 | 225 | ||
222 | /* | 226 | /* |
227 | * srandomdev: | ||
228 | * | ||
229 | * Many programs choose the seed value in a totally predictable manner. | ||
230 | * This often causes problems. We seed the generator using the much more | ||
231 | * secure arandom(4) interface. Note that this particular seeding | ||
232 | * procedure can generate states which are impossible to reproduce by | ||
233 | * calling srandom() with any value, since the succeeding terms in the | ||
234 | * state buffer are no longer derived from the LC algorithm applied to | ||
235 | * a fixed seed. | ||
236 | */ | ||
237 | void | ||
238 | srandomdev() | ||
239 | { | ||
240 | int fd; | ||
241 | size_t len; | ||
242 | |||
243 | if (rand_type == TYPE_0) | ||
244 | len = sizeof(state[0]); | ||
245 | else | ||
246 | len = rand_deg * sizeof(state[0]); | ||
247 | |||
248 | if ((fd = open("/dev/arandom", O_RDONLY, 0)) != -1 && | ||
249 | read(fd, (void *) state, len) == (ssize_t) len) { | ||
250 | close(fd); | ||
251 | } else { | ||
252 | struct timeval tv; | ||
253 | u_int junk; | ||
254 | |||
255 | /* XXX - this could be better */ | ||
256 | gettimeofday(&tv, NULL); | ||
257 | srandom(getpid() ^ tv.tv_sec ^ tv.tv_usec ^ junk); | ||
258 | return; | ||
259 | } | ||
260 | |||
261 | if (rand_type != TYPE_0) { | ||
262 | fptr = &state[rand_sep]; | ||
263 | rptr = &state[0]; | ||
264 | } | ||
265 | } | ||
266 | |||
267 | /* | ||
223 | * initstate: | 268 | * initstate: |
224 | * | 269 | * |
225 | * Initialize the state information in the given array of n bytes for future | 270 | * Initialize the state information in the given array of n bytes for future |