| Class | Resolv::IPv6 |
| In: |
lib/resolv.rb
|
| Parent: | Object |
A Resolv::DNS IPv6 address.
| Regex_8Hex | = | /\A (?:[0-9A-Fa-f]{1,4}:){7} [0-9A-Fa-f]{1,4} \z/x | IPv6 address format a:b:c:d:e:f:g:h | |
| Regex_CompressedHex | = | /\A ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) :: ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) \z/x | Compressed IPv6 address format a::b | |
| Regex_6Hex4Dec | = | /\A ((?:[0-9A-Fa-f]{1,4}:){6,6}) (\d+)\.(\d+)\.(\d+)\.(\d+) \z/x | IPv4 mapped IPv6 address format a:b:c:d:e:f:w.x.y.z | |
| Regex_CompressedHex4Dec | = | /\A ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) :: ((?:[0-9A-Fa-f]{1,4}:)*) (\d+)\.(\d+)\.(\d+)\.(\d+) \z/x | Compressed IPv4 mapped IPv6 address format a::b:w.x.y.z | |
| Regex | = | / (?:#{Regex_8Hex}) | (?:#{Regex_CompressedHex}) | (?:#{Regex_6Hex4Dec}) | (?:#{Regex_CompressedHex4Dec})/x | A composite IPv6 address Regexp. |
Creates a new IPv6 address from arg which may be:
| IPv6: | returns arg. |
| String: | arg must match one of the IPv6::Regex* constants |
# File lib/resolv.rb, line 2153
2153: def self.create(arg)
2154: case arg
2155: when IPv6
2156: return arg
2157: when String
2158: address = ''
2159: if Regex_8Hex =~ arg
2160: arg.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
2161: elsif Regex_CompressedHex =~ arg
2162: prefix = $1
2163: suffix = $2
2164: a1 = ''
2165: a2 = ''
2166: prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
2167: suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
2168: omitlen = 16 - a1.length - a2.length
2169: address << a1 << "\0" * omitlen << a2
2170: elsif Regex_6Hex4Dec =~ arg
2171: prefix, a, b, c, d = $1, $2.to_i, $3.to_i, $4.to_i, $5.to_i
2172: if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
2173: prefix.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
2174: address << [a, b, c, d].pack('CCCC')
2175: else
2176: raise ArgumentError.new("not numeric IPv6 address: " + arg)
2177: end
2178: elsif Regex_CompressedHex4Dec =~ arg
2179: prefix, suffix, a, b, c, d = $1, $2, $3.to_i, $4.to_i, $5.to_i, $6.to_i
2180: if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
2181: a1 = ''
2182: a2 = ''
2183: prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
2184: suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
2185: omitlen = 12 - a1.length - a2.length
2186: address << a1 << "\0" * omitlen << a2 << [a, b, c, d].pack('CCCC')
2187: else
2188: raise ArgumentError.new("not numeric IPv6 address: " + arg)
2189: end
2190: else
2191: raise ArgumentError.new("not numeric IPv6 address: " + arg)
2192: end
2193: return IPv6.new(address)
2194: else
2195: raise ArgumentError.new("cannot interpret as IPv6 address: #{arg.inspect}")
2196: end
2197: end
Turns this IPv6 address into a Resolv::DNS::Name.
# File lib/resolv.rb, line 2228
2228: def to_name
2229: return DNS::Name.new(
2230: @address.unpack("H32")[0].split(//).reverse + ['ip6', 'arpa'])
2231: end