From: "nori_nori (Tadanori Kojima)" Date: 2013-03-08T14:48:18+09:00 Subject: [ruby-dev:47149] [ruby-trunk - Feature #8047][Open] IPAddr makes host address with netmask Issue #8047 has been reported by nori_nori (Tadanori Kojima). ---------------------------------------- Feature #8047: IPAddr makes host address with netmask https://bugs.ruby-lang.org/issues/8047 Author: nori_nori (Tadanori Kojima) Status: Open Priority: Normal Assignee: Category: Target version: 現状のIPAddrはネットマスク付きの場合、 IPAddr.new("192.168.1.99/24") => # のようにネットワークアドレスとして生成されますが、 マスク付きの場合にマスクされないホストとして生成する モードを提案します (=ホストのIPアドレスとどのネットワークかを把握したい) ex. IPAddr.new("192.168.1.99/24") => # newの第二引数にfamilyが指定されていれば32bitマスクのホストアドレスなので、 引数がAF_INET/INET6または:Hostならばホストとして生成させます - IPAddr.new(int, family) IPAddr.new(3232235875, Socket::AF_INET) => # - IPAddr.new(ip, :Host) IPAddr.new("192.168.1.99/24", :Host) => # 引数の構成とシンボル名がイマイチですが既存との両立ということで 以下がパッチになります --- ipaddr.rb.orig 2013-03-08 13:59:07.000000000 +0900 +++ ipaddr.rb 2013-03-08 14:35:06.000000000 +0900 @@ -440,7 +440,7 @@ else raise AddressFamilyError, "unsupported address family" end - @addr = ((@addr >> masklen) << masklen) + @addr = ((@addr >> masklen) << masklen) if @host_mode == false return self end @@ -477,6 +477,14 @@ raise AddressFamilyError, "unsupported address family: #{family}" end end + + if family == :Host + @host_mode = true + family = Socket::AF_UNSPEC + else + @host_mode = false + end + prefix, prefixlen = addr.split('/') if prefix =~ /^\[(.*)\]$/i prefix = $1 -- http://bugs.ruby-lang.org/