From 1b27958bfb62041721d010c42ee6670bcdd76341 Mon Sep 17 00:00:00 2001 From: akr Date: Mon, 3 Jan 2005 05:13:18 +0000 Subject: * 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/trunk@7716 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- random.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'random.c') diff --git a/random.c b/random.c index e8fa78b944..3f34b04158 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; } -- cgit v1.2.3