summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-01-03 02:41:03 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-01-03 02:41:03 +0000
commit35100a5a039f9c3a7d5de12c8a19115ec7f9a0f2 (patch)
tree37287fe87c566240b2f6baf6a0d87883718bfba5
parentfc1a6902d2fe8f5249f4fa3dd4c3e72bb0be7517 (diff)
downloadruby-35100a5a039f9c3a7d5de12c8a19115ec7f9a0f2.tar.gz
ruby-35100a5a039f9c3a7d5de12c8a19115ec7f9a0f2.tar.xz
ruby-35100a5a039f9c3a7d5de12c8a19115ec7f9a0f2.zip
* random.c (random_seed): use /dev/urandom if available.
[ruby-dev:25392] git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@7713 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--random.c20
2 files changed, 24 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index a3cf5489f..8e207e7d5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 11:03:37 2005 Masatoshi SEKI <m_seki@mva.biglobe.ne.jp>
* test/drb/test_drb.rb: move TestDRbReusePort to new file.
diff --git a/random.c b/random.c
index a317aa5cc..e8fa78b94 100644
--- a/random.c
+++ b/random.c
@@ -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;
}
/*