summaryrefslogtreecommitdiff
path: root/random.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-01-03 05:13:18 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-01-03 05:13:18 +0000
commitc664f0a534dd0912161106f1503fe6d7fc92a2fd (patch)
tree60570f3d8d44e1b39ea31c14f24d56a46d6d977e /random.c
parentb0673e723e35e4bc7c2f2f2e64b58680d14e7be7 (diff)
* random.c (random_seed): don't use /dev/urandom if it is not character device.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@7716 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'random.c')
-rw-r--r--random.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/random.c b/random.c
index e8fa78b..3f34b04 100644
--- a/random.c
+++ b/random.c
@@ -175,17 +175,29 @@ random_seed()
unsigned long result;
int fd;
unsigned long buf;
+ struct stat statbuf;
gettimeofday(&tv, 0);
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));
+#ifdef S_ISCHR
+ if ((fd = open("/dev/urandom", O_RDONLY|O_NONBLOCK
+#ifdef O_NOCTTY
+ |O_NOCTTY
+#endif
+#ifdef O_NOFOLLOW
+ |O_NOFOLLOW
+#endif
+ )) >= 0) {
+ if (fstat(fd, &statbuf) == 0 && S_ISCHR(statbuf.st_mode)) {
+ read(fd, &buf, sizeof(buf));
+ result ^= buf;
+ }
close(fd);
- result ^= buf;
}
+#endif
return result;
}