From 3512acb03b627e8090cafd2a6d7caaa003905c4e Mon Sep 17 00:00:00 2001 From: Ari Brown Date: Sat, 23 Feb 2008 12:01:24 -0500 Subject: [PATCH] Made change to IPAddr and fixed spec for IPv6 * optional definition of AF_INET6 (better than previous patch of mine) * edited spec --- spec/ruby/1.8/library/ipaddr/new_spec.rb | 4 +- stdlib/ipaddr.rb | 63 +++++++++++++++-------------- 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/spec/ruby/1.8/library/ipaddr/new_spec.rb b/spec/ruby/1.8/library/ipaddr/new_spec.rb index 0ebb95a..e720af3 100644 --- a/spec/ruby/1.8/library/ipaddr/new_spec.rb +++ b/spec/ruby/1.8/library/ipaddr/new_spec.rb @@ -3,7 +3,7 @@ require 'ipaddr' describe "IPAddr#new" do it 'it should initialize IPAddr' do - lambda{ IPAddr.new("3FFE:505:ffff::/48") }.should_not raise_error + lambda{ IPAddr.new("3ffe:505:ffff::/48") }.should_not raise_error lambda{ IPAddr.new("0:0:0:1::") }.should_not raise_error lambda{ IPAddr.new("2001:200:300::/48") }.should_not raise_error end @@ -16,7 +16,7 @@ describe "IPAddr#new" do end it 'it should initialize IPAddr ipv6 address with long notation' do - a = IPAddr.new("0123:4567:89ab:cdef:0ABC:DEF0:1234:5678") + a = IPAddr.new("0123:4567:89ab:cdef:0abc:def0:1234:5678") a.to_s.should == "123:4567:89ab:cdef:abc:def0:1234:5678" a.to_string.should == "0123:4567:89ab:cdef:0abc:def0:1234:5678" a.family.should == Socket::AF_INET6 diff --git a/stdlib/ipaddr.rb b/stdlib/ipaddr.rb index 6aa440d..919bece 100644 --- a/stdlib/ipaddr.rb +++ b/stdlib/ipaddr.rb @@ -16,44 +16,44 @@ unless Socket.const_defined? "AF_INET6" class Socket AF_INET6 = Object.new end - - class << IPSocket - def valid_v4?(addr) - if /\A(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\Z/ =~ addr - return $~.captures.all? {|i| i.to_i < 256} - end - return false +end +class << IPSocket + def valid_v4?(addr) + if /\A(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\Z/ =~ addr + return $~.captures.all? {|i| i.to_i < 256} end + return false + end - def valid_v6?(addr) - # IPv6 (normal) - return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*\Z/ =~ addr - return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*)?\Z/ =~ addr - return true if /\A::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*)?\Z/ =~ addr - # IPv6 (IPv4 compat) - return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:/ =~ addr && valid_v4?($') - return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:)?/ =~ addr && valid_v4?($') - return true if /\A::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:)?/ =~ addr && valid_v4?($') + def valid_v6?(addr) + # IPv6 (normal) + return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*\Z/ =~ addr + return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*)?\Z/ =~ addr + return true if /\A::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*)?\Z/ =~ addr + # IPv6 (IPv4 compat) + return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:/ =~ addr && valid_v4?($') + return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:)?/ =~ addr && valid_v4?($') + return true if /\A::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:)?/ =~ addr && valid_v4?($') - false - end + false + end - def valid?(addr) - valid_v4?(addr) || valid_v6?(addr) - end + def valid?(addr) + valid_v4?(addr) || valid_v6?(addr) + end - alias getaddress_orig getaddress - def getaddress(s) - if valid?(s) - s - elsif /\A[-A-Za-z\d.]+\Z/ =~ s - getaddress_orig(s) - else - raise ArgumentError, "invalid address" - end + alias getaddress_orig getaddress + def getaddress(s) + if valid?(s) + s + elsif /\A[-A-Za-z\d.]+\Z/ =~ s + getaddress_orig(s) + else + raise ArgumentError, "invalid address" end end end +#end # IPAddr provides a set of methods to manipulate an IP address. Both IPv4 and # IPv6 are supported. @@ -104,6 +104,8 @@ class IPAddr end return s end + + def addr; @addr; end # Returns a new ipaddr built by bitwise AND. def &(other) @@ -430,6 +432,7 @@ class IPAddr end if !@addr && (family == Socket::AF_UNSPEC || family == Socket::AF_INET6) @addr = in6_addr(prefix) + @prefix = prefix @family = Socket::AF_INET6 end if family != Socket::AF_UNSPEC && @family != family -- 1.5.3.7