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, 桂遊生丸)