Feature #10911 ยป ipaddr-ipv6-zone-id-10911.patch
lib/ipaddr.rb | ||
---|---|---|
str = sprintf('::%s%d.%d.%d.%d', $1, $2.hex / 256, $2.hex % 256, $3.hex / 256, $3.hex % 256)
|
||
end
|
||
if @family == Socket::AF_INET6
|
||
str << zone_id.to_s
|
||
end
|
||
str
|
||
end
|
||
... | ... | |
# Returns a hash value used by Hash, Set, and Array classes
|
||
def hash
|
||
return ([@addr, @mask_addr].hash << 1) | (ipv4? ? 0 : 1)
|
||
return ([@addr, @mask_addr, @zone_id].hash << 1) | (ipv4? ? 0 : 1)
|
||
end
|
||
# Creates a Range object for the network address.
|
||
... | ... | |
af = "IPv4"
|
||
when Socket::AF_INET6
|
||
af = "IPv6"
|
||
zone_id = @zone_id.to_s
|
||
else
|
||
raise AddressFamilyError, "unsupported address family"
|
||
end
|
||
return sprintf("#<%s: %s:%s/%s>", self.class.name,
|
||
af, _to_string(@addr), _to_string(@mask_addr))
|
||
return sprintf("#<%s: %s:%s%s/%s>", self.class.name,
|
||
af, _to_string(@addr), zone_id, _to_string(@mask_addr))
|
||
end
|
||
# Returns the IPv6 zone identifier, if present.
|
||
# Raises InvalidAddressError if not an IPv6 address.
|
||
def zone_id
|
||
if @family == Socket::AF_INET6
|
||
@zone_id
|
||
else
|
||
raise InvalidAddressError, "not an IPv6 address"
|
||
end
|
||
end
|
||
# Returns the IPv6 zone identifier, if present.
|
||
# Raises InvalidAddressError if not an IPv6 address.
|
||
def zone_id=(zid)
|
||
if @family == Socket::AF_INET6
|
||
case zid
|
||
when nil, /\A%(\w+)\z/
|
||
@zone_id = zid
|
||
else
|
||
raise InvalidAddressError, "invalid zone identifier for address"
|
||
end
|
||
else
|
||
raise InvalidAddressError, "not an IPv6 address"
|
||
end
|
||
end
|
||
protected
|
||
... | ... | |
prefix = $1
|
||
family = Socket::AF_INET6
|
||
end
|
||
if prefix =~ /\A(.*)(%\w+)\z/
|
||
prefix = $1
|
||
zone_id = $2
|
||
family = Socket::AF_INET6
|
||
end
|
||
# It seems AI_NUMERICHOST doesn't do the job.
|
||
#Socket.getaddrinfo(left, nil, Socket::AF_INET6, Socket::SOCK_STREAM, nil,
|
||
# Socket::AI_NUMERICHOST)
|
||
... | ... | |
if !@addr && (family == Socket::AF_UNSPEC || family == Socket::AF_INET6)
|
||
@addr = in6_addr(prefix)
|
||
@family = Socket::AF_INET6
|
||
@zone_id = zone_id
|
||
end
|
||
if family != Socket::AF_UNSPEC && @family != family
|
||
raise AddressFamilyError, "address family mismatch"
|
test/test_ipaddr.rb | ||
---|---|---|
assert_equal("3ffe:0505:0002:0000:0000:0000:0000:0000", a.to_string)
|
||
assert_equal(Socket::AF_INET6, a.family)
|
||
assert_equal(48, a.prefix)
|
||
assert_nil(a.zone_id)
|
||
a = IPAddr.new("fe80::1%ab0")
|
||
assert_equal("fe80::1%ab0", a.to_s)
|
||
assert_equal("fe80:0000:0000:0000:0000:0000:0000:0001", a.to_string)
|
||
assert_equal(Socket::AF_INET6, a.family)
|
||
assert_equal(false, a.ipv4?)
|
||
assert_equal(true, a.ipv6?)
|
||
assert_equal("#<IPAddr: IPv6:fe80:0000:0000:0000:0000:0000:0000:0001%ab0/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff>", a.inspect)
|
||
assert_equal(128, a.prefix)
|
||
assert_equal('%ab0', a.zone_id)
|
||
a = IPAddr.new("0.0.0.0")
|
||
assert_equal("0.0.0.0", a.to_s)
|
||
... | ... | |
assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("192.168.0.256") }
|
||
assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("192.168.0.011") }
|
||
assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("fe80::1%fxp0") }
|
||
assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("fe80::1%") }
|
||
assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("fe80::1%]") }
|
||
assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("[192.168.1.2]/120") }
|
||
assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("[2001:200:300::]\nINVALID") }
|
||
assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("192.168.0.1/32\nINVALID") }
|
||
... | ... | |
assert_equal("3ffe:0505:0002:0000:0000:0000:0000:0001", IPAddr.new("3ffe:505:2::1").to_string)
|
||
assert_equal("3ffe:505:2::1", IPAddr.new("3ffe:505:2::1").to_s)
|
||
end
|
||
def test_zone_id
|
||
a = IPAddr.new("192.168.1.2")
|
||
assert_raise(IPAddr::InvalidAddressError) { a.zone_id = '%ab0' }
|
||
assert_raise(IPAddr::InvalidAddressError) { a.zone_id }
|
||
a = IPAddr.new("1:2:3:4:5:6:7:8")
|
||
a.zone_id = '%ab0'
|
||
assert_equal('%ab0', a.zone_id)
|
||
assert_equal("1:2:3:4:5:6:7:8%ab0", a.to_s)
|
||
assert_raise(IPAddr::InvalidAddressError) { a.zone_id = '%' }
|
||
end
|
||
end
|
||
class TC_Operator < Test::Unit::TestCase
|