From: Eizi TOYODA Date: 2005-11-14T11:02:32+09:00 Subject: [ruby-dev:27699] Re: readlink(2) fails if content is too long なかださま すみません。AIX で ERANGE を返すのは GPFS というファイルシステムの時だけなんだそうで、それ以外では readlink(2) は切捨てなんだそうです。そこで、問題のループは for (;;) { rv = readlink(RSTRING(path)->ptr, buf, size); if (rv != size) break; #ifdef _AIX if (rv > 0 || errno != ERANGE) break; #endif size *= 2; buf = xrealloc(buf, size); のようにして頂かないと AIX 非GPFS のときに無限ループになってしまいます。 二度手間ですみません。よろしくお願いします。 On 11/5/05, nobu@ruby-lang.org wrote: > なかだです。 > > 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はできる。 > 中田 伸悦 > >