summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--file.c10
2 files changed, 9 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index da722d1e47..2f67f4a63f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Nov 14 23:49:57 2005 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_file_s_readlink): ERANGE will occur only on GPFS.
+ [ruby-dev:27699]
+
Mon Nov 14 17:36:22 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
* array.c (rb_ary_first): RDoc update from Daniel Berger
diff --git a/file.c b/file.c
index decb5ba81e..8db72a089a 100644
--- a/file.c
+++ b/file.c
@@ -2051,13 +2051,11 @@ rb_file_s_readlink(klass, path)
SafeStringValue(path);
buf = xmalloc(size);
- for (;;) {
- rv = readlink(RSTRING(path)->ptr, buf, size);
-#ifndef _AIX
- if (rv != size) break;
-#else
- if (rv > 0 || errno != ERANGE) break;
+ while ((rv = readlink(RSTRING(path)->ptr, buf, size)) == size
+#ifdef _AIX
+ || (rv < 0 && errno == ERANGE) /* quirky behavior of GPFS */
#endif
+ ) {
size *= 2;
buf = xrealloc(buf, size);
}