こんにちは、なかむら(う)です。

test/drbをmswin32版で実行していて気づいた点が二つあります。

一つ目は、test/drb/test_drbunix.rbをtest/runner.rb経由で実行
すると、エラーになってしまう(テストがEになる、という意味では
なく)ことです。

具体的には、

| C:/ruby/lib/ruby/1.8/drb/unix.rb:80:in `temp_server': uninitialized constant DRb::DRbUNIXSocket::UNIXServer (NameError)
|         from C:/lang/ruby/lib/ruby/1.8/drb/unix.rb:29:in `open_server'
(中略)
|         from test/drb/test_drbunix.rb:11:in `new'
(以下略)

というエラーが出ます。

要するにWindowsだからSocket::UNIX*がないということなのですが、
で、あれば、DRb::DRbUNIXSocket::UNIXServer.new を実行した時で
はなくて、require 'drb/unix' したときにエラーが出て欲しいよう
な気がします(そしてそれはLoadErrorあたりがうれしい)。

どうでしょうか?


二つ目は、test/drb/test_acl.rbの中でEが出ることです。
これは結局のところ、AF_INET6なしの環境でコンパイルされたruby
でlib/ipaddr.rbの IPAddr#ipv6? を実行すると、Socket::AF_INET6
が定義されていないために NameError が出てしまうのが原因です。
これについてはいろいろ考えてみたところ、

(1) Socket::AF_INET6 が定義されていないときは IPAddr#ipv6? は
    常に false を返す。
(2) Socket::AF_INET6 定義しちゃう。
(3) そもそもsocket.soに依存してるのがよくないので依存性排除。
(4) AF_INET6もないヤツが悪い。よって現状維持。

くらいの対策があるんではないかと思います。

で、私自身は「IPアドレスを扱うためごときでsocket.soなんかいら
んやろ」と思い込んで(3)でつっぱしってみたのですが、よく考えた
ら IPAddr.new の第二引数や IPAddr#family などで Socket::AF_*
を受け付けている/返しているので、単純にsocket.soへの依存性を
排除してしまうと、現状との互換性がなくなってしまうのでした。
さりとて互換性を残そうとすると、元の「Socket::AF_INET6 が定義
されていない」という問題に立ち戻ってしまいます。

どうしたらいいでしょう?

なお、互換性を無視して作っちゃったipaddr.rbの改造版は
  http://rrr.jin.gr.jp/~usa/ruby/ipaddr.diff (現状からの差分)
  http://rrr.jin.gr.jp/~usa/ruby/ipaddr.rb   (全体)
にあります。


それでは
-- 
U.Nakamura <usa / osb.att.ne.jp>