In article <1014700933.711454.28068.nullmailer / ev.netlab.jp>,
  matz / ruby-lang.org (Yukihiro Matsumoto) writes:

> 面白いので取り込もうと思うのですが、パッチ当てたら、哲さんこ
> の部分はメンテしてくださる?

えぇ。それはかまいません。

ただ、取り込む前に API をちょっと議論したいです。

送る方の

UNIXSocket#send_io(io) # IO を渡す。
UNIXSocket#send_io(fd) # Fixnum を渡す。

はいいんですが、受け取る方の

UNIXSocket#recv_io(mode=nil, klass=IO)

はちょっとうまくないかもしれないと思っています。動作としては fd を受け
取ったら

  mode が nil なら klass.for_fd(fd) の結果を返す。
  mode が nil でないなら klass.for_fd(fd, mode) の結果を返す。
  klass に nil を指定されたら受け取った fd を Fixnum として返す。

となっていて、引数に mode と klass を渡すというところまではいいんです
が、順番が問題です。あるいは IO.for_fd は引数を二つとれるけれど、
BasicSocket.for_fd は引数が一つという違いが問題なのかも知れません。

これに関連して、NetBSD は pipe が socket なのですが、

netbsd% ./ruby -rsocket -e 'r,w=IO.pipe; p r.stat.socket?; UNIXSocket.for_fd(r.fileno)'
true
-e:1:in `for_fd': Invalid argument (Errno::EINVAL)
        from -e:1

というようにエラーになるので、BasicSocket.for_fd も mode をとれるよう
にして欲しいなぁ、という話もあったりします。

どうも fcntl で F_GETFL を使って、ある file descriptor の読み書きのモー
ドがわかるらしくて、それを使って fdopen が(システムコールに関係なく)失
敗していみたいなんですよねぇ。ktruss しても全然失敗してないのにどこか
ら EINVAL が湧き出してきたのかと...
-- 
[田中 哲][たなか あきら][Tanaka Akira]
「ふえろ! わかめちゃん作戦です$(C⊇」(Little Worker, 桂遊生丸)