From: nobu@... Date: 2005-11-06T09:26:36+09:00 Subject: [ruby-dev:27639] Re: readlink(2) fails if content is too long なかだです。 At Fri, 4 Nov 2005 02:16:36 +0900, Eizi TOYODA wrote in [ruby-dev:27634]: > ところが、AIX ではバッファの長さが足りないとエラーになって errno が ERANGE となるんだそうです。 > http://publib16.boulder.ibm.com/pseries/en_US/libs/basetrf2/readlink.htm > > すると、以下のようにすれば動くはずです。AIX で試せていないのですが、 手元の Linux > ではとりあえず動いているようです。(readlink をラップして無理やり ERANGE を返させた場合を含め) > > 一応、X/Open のほうでは ERANGE > を返す場合の記述はないので、他の環境で無限ループに陥ることはないと思いますが、絶対ないかどうかはなんともいえません。 AIXだけが別なら、_AIXで分けるほうがいいかも知れません。 Index: file.c =================================================================== RCS file: /cvs/ruby/src/ruby/file.c,v retrieving revision 1.218 diff -p -U 2 -r1.218 file.c --- file.c 20 Oct 2005 02:22:48 -0000 1.218 +++ file.c 6 Nov 2005 00:22:19 -0000 @@ -1983,5 +1983,11 @@ rb_file_s_readlink(VALUE klass, VALUE pa FilePathValue(path); buf = xmalloc(size); - while ((rv = readlink(StringValueCStr(path), buf, size)) == size) { + for (;;) { + rv = readlink(RSTRING(path)->ptr, buf, size); +#ifndef _AIX + if (rv != size) break; +#else + if (rv > 0 || errno != ERANGE) break; +#endif size *= 2; buf = xrealloc(buf, size); -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦