[ruby] TCPServer.open error on Mac OS X

起きた状況はこんなんだった。
ところどころ編集してるけど。

$ uname -a
Darwin mac-mini.local 9.6.0 Darwin Kernel Version 9.6.0: Mon Nov 24 17:37:00 PST 2008; root:xnu-1228.9.59~1/RELEASE_I386 i386
$ ifconfig
lo0: flags=8049 mtu 16384
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
en1: flags=8863 mtu 1500
        inet6 fe80::21f:5bff:fe3f:c9bc%en1 prefixlen 64 scopeid 0x6
        inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
        ether 00:1f:5b:3f:c9:bc
        media: autoselect status: active
        supported media: autoselect
$ irb
irb(main):001:0> require 'socket'
=> true
irb(main):002:0> Socket::getaddrinfo('localhost', nil, Socket::AF_UNSPEC, Socket::SOCK_STREAM, 0, Socket::AI_PASSIVE).collect{|af,*_|af}
=> ["AF_INET6", "AF_INET"]
irb(main):003:0> DRb.start_service
SocketError: getaddrinfo: nodename nor servname provided, or not known
        from /Users/yuji/opt/ports/lib/ruby/1.8/drb/drb.rb:853:in `initialize'
        from /Users/yuji/opt/ports/lib/ruby/1.8/drb/drb.rb:853:in `open'
        from /Users/yuji/opt/ports/lib/ruby/1.8/drb/drb.rb:853:in `open_server_inaddr_any'
        from /Users/yuji/opt/ports/lib/ruby/1.8/drb/drb.rb:865:in `open_server'
        from /Users/yuji/opt/ports/lib/ruby/1.8/drb/drb.rb:759:in `open_server'
        from /Users/yuji/opt/ports/lib/ruby/1.8/drb/drb.rb:757:in `each'
        from /Users/yuji/opt/ports/lib/ruby/1.8/drb/drb.rb:757:in `open_server'
        from /Users/yuji/opt/ports/lib/ruby/1.8/drb/drb.rb:1347:in `initialize'
        from /Users/yuji/opt/ports/lib/ruby/1.8/drb/drb.rb:1635:in `new'
        from /Users/yuji/opt/ports/lib/ruby/1.8/drb/drb.rb:1635:in `start_service'
        from (irb):1

えー...

該当部分はこんなん。

    def self.open_server_inaddr_any(host, port)
      infos = Socket::getaddrinfo(host, nil,
                                  Socket::AF_UNSPEC,
                                  Socket::SOCK_STREAM,
                                  0,
                                  Socket::AI_PASSIVE)
      family = infos.collect { |af, *_| af }.uniq
      case family
      when ['AF_INET']
        return TCPServer.open('0.0.0.0', port)
      when ['AF_INET6']
        return TCPServer.open('::', port)
      else
        return TCPServer.open(port)
      end
    end

host には Socket.gethostname の返り値が設定されている。
case を見る限り、family の配列要素が 1 つならそれぞれのアドレスで TCPServer を作ってる。
今回は、TCPServer.open(port) で例外になってるみたい。
irb で確認してみる。

irb(main):004:0> TCPServer.open(0)
SocketError: getaddrinfo: nodename nor servname provided, or not known
        from (irb):2:in `initialize'
        from (irb):2:in `open'
        from (irb)

ありゃりゃ。
これってどこでも起きるものなの ?

Thinkpad x32 (Ubuntu 8.10) で確認してみる。

$ uname -a
Linux artemis 2.6.27-9-generic #1 SMP Thu Nov 20 21:57:00 UTC 2008 i686 GNU/Linux
$ ifconfig
eth0      Link encap:イーサネット  ハードウェアアドレス 00:11:25:b4:77:67  
          UP BROADCAST MULTICAST  MTU:1500  メトリック:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000 
          RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)

eth1      Link encap:イーサネット  ハードウェアアドレス 00:12:f0:a4:cc:3a  
          inetアドレス:192.168.1.4  ブロードキャスト:192.168.1.255  マスク:255.255.255.0
          inet6アドレス: fe80::212:f0ff:fea4:cc3a/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:487202 エラー:7 損失:7 オーバラン:0 フレーム:0
          TXパケット:234243 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000 
          RXバイト:3195439910 (3.1 GB)  TXバイト:95220990 (95.2 MB)
          割り込み:11 ベースアドレス:0xe000 メモリ:c0210000-c0210fff 

lo        Link encap:ローカルループバック  
          inetアドレス:127.0.0.1  マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:16436  メトリック:1
          RXパケット:774223 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:774223 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0 
          RXバイト:1222618125 (1.2 GB)  TXバイト:1222618125 (1.2 GB)
$ irb -rsocket
irb(main):001:0> TCPServer.open(0)
=> #

えー ...

ということで Mac だけの問題のような気もしてきました。
何が悪いのか。