From: Eizi TOYODA Date: 2005-11-04T02:16:36+09:00 Subject: [ruby-dev:27634] readlink(2) fails if content is too long 知人より、 AIX で File::readlink がエラーになることがあるという話をききました。 readlink(2) というのは、バッファの長さが足りないと中味を切り詰めて帰すので、現行の 1.8.3 ではとりあえず 100 バイトのバッファで試してみて、readlink(2) の返却値とバッファ長が同じだったらバッファを倍にしてやりなおし、というアルゴリズムになっていると思います。 ところが、AIX ではバッファの長さが足りないとエラーになって errno が ERANGE となるんだそうです。 http://publib16.boulder.ibm.com/pseries/en_US/libs/basetrf2/readlink.htm すると、以下のようにすれば動くはずです。AIX で試せていないのですが、 手元の Linux ではとりあえず動いているようです。(readlink をラップして無理やり ERANGE を返させた場合を含め) 一応、X/Open のほうでは ERANGE を返す場合の記述はないので、他の環境で無限ループに陥ることはないと思いますが、絶対ないかどうかはなんともいえません。 あまりすっきりしなくて申し訳ないですが、いちおうご報告まで。 豊田英司 *** ruby-1.8.3/file.c 2005-09-20 12:51:20.000000000 -0500 --- ruby-1.8.3-readlink/file.c 2005-11-01 20:06:55.846608274 -0600 *************** *** 1994,2000 **** SafeStringValue(path); buf = xmalloc(size); ! while ((rv = readlink(StringValueCStr(path), buf, size)) == size) { size *= 2; buf = xrealloc(buf, size); } --- 1994,2005 ---- SafeStringValue(path); buf = xmalloc(size); ! for (;;) { ! rv = readlink(StringValueCStr(path), buf, size); ! if ((rv > 0) && (rv < size)) ! break; ! if ((rv < 0) && (errno != ERANGE)) ! break; size *= 2; buf = xrealloc(buf, size); }