diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-01-03 02:46:26 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-01-03 02:46:26 +0000 |
commit | 3ac7eb140480caea6f9ee8af6faa3e2a924b9b66 (patch) | |
tree | a078908f924168e03f10aa7d6a287fbdf3cc1472 | |
parent | 54980ce497ca577b817158137f199077daec7bb6 (diff) |
* random.c (random_seed): use /dev/urandom if available.
[ruby-dev:25392]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@7714 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | random.c | 20 |
2 files changed, 24 insertions, 1 deletions
@@ -1,3 +1,8 @@ +Mon Jan 3 11:37:42 2005 Tanaka Akira <akr@m17n.org> + + * random.c (random_seed): use /dev/urandom if available. + [ruby-dev:25392] + Mon Jan 3 07:46:42 2005 GOTOU Yuuzou <gotoyuzo@notwork.org> * lib/webrick/httpauth/htpasswd.rb (WEBrick::Htpasswd#reload): @@ -144,6 +144,11 @@ genrand_real() #include <unistd.h> #endif #include <time.h> +#include <sys/types.h> +#include <sys/stat.h> +#ifdef HAVE_FCNTL_H +#include <fcntl.h> +#endif static int first = 1; @@ -167,9 +172,22 @@ random_seed() { static int n = 0; struct timeval tv; + unsigned long result; + int fd; + unsigned long buf; gettimeofday(&tv, 0); - return tv.tv_sec ^ tv.tv_usec ^ getpid() ^ n++; + result = tv.tv_sec ^ tv.tv_usec ^ getpid() ^ n++; + + result += (unsigned long)&result; + + if ((fd = open("/dev/urandom", O_RDONLY)) >= 0) { + read(fd, &buf, sizeof(buf)); + close(fd); + result ^= buf; + } + + return result; } /* |