Feature #8047
Updated by shyouhei (Shyouhei Urabe) about 7 years ago
現状のIPAddrはネットマスク付きの場合、 ``` IPAddr.new("192.168.1.99/24") => #<IPAddr: IPv4:192.168.1.0/255.255.255.0> ``` のようにネットワークアドレスとして生成されますが、 マスク付きの場合にマスクされないホストとして生成する モードを提案します (=ホストのIPアドレスとどのネットワークかを把握したい) ex. ``` IPAddr.new("192.168.1.99/24") => #<IPAddr: IPv4:192.168.1.99/255.255.255.0> ``` newの第二引数にfamilyが指定されていれば32bitマスクのホストアドレスなので、 引数がAF_INET/INET6または:Hostならばホストとして生成させます - IPAddr.new(int, family) ``` IPAddr.new(3232235875, Socket::AF_INET) => #<IPAddr: IPv4:192.168.1.99/255.255.255.255> ``` - IPAddr.new(ip, :Host) ``` IPAddr.new("192.168.1.99/24", :Host) => #<IPAddr: IPv4:192.168.1.99/255.255.255.0> ``` 引数の構成とシンボル名がイマイチですが既存との両立ということで 以下がパッチになります ``` --- 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 ```