Class Resolv::IPv6
In: lib/resolv.rb
Parent: Object

Methods

==   create   eql?   hash   inspect   new   to_name   to_s  

Constants

Regex_8Hex = /\A (?:[0-9A-Fa-f]{1,4}:){7} [0-9A-Fa-f]{1,4} \z/x
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
Regex_6Hex4Dec = /\A ((?:[0-9A-Fa-f]{1,4}:){6,6}) (\d+)\.(\d+)\.(\d+)\.(\d+) \z/x
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
Regex = / (?:#{Regex_8Hex}) | (?:#{Regex_CompressedHex}) | (?:#{Regex_6Hex4Dec}) | (?:#{Regex_CompressedHex4Dec})/x

Attributes

address  [R] 

Public Class methods

[Source]

      # File lib/resolv.rb, line 1797
1797:     def self.create(arg)
1798:       case arg
1799:       when IPv6
1800:         return arg
1801:       when String
1802:         address = ''
1803:         if Regex_8Hex =~ arg
1804:           arg.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
1805:         elsif Regex_CompressedHex =~ arg
1806:           prefix = $1
1807:           suffix = $2
1808:           a1 = ''
1809:           a2 = ''
1810:           prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
1811:           suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
1812:           omitlen = 16 - a1.length - a2.length
1813:           address << a1 << "\0" * omitlen << a2
1814:         elsif Regex_6Hex4Dec =~ arg
1815:           prefix, a, b, c, d = $1, $2.to_i, $3.to_i, $4.to_i, $5.to_i
1816:           if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
1817:             prefix.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
1818:             address << [a, b, c, d].pack('CCCC')
1819:           else
1820:             raise ArgumentError.new("not numeric IPv6 address: " + arg)
1821:           end
1822:         elsif Regex_CompressedHex4Dec =~ arg
1823:           prefix, suffix, a, b, c, d = $1, $2, $3.to_i, $4.to_i, $5.to_i, $6.to_i
1824:           if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
1825:             a1 = ''
1826:             a2 = ''
1827:             prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
1828:             suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
1829:             omitlen = 12 - a1.length - a2.length
1830:             address << a1 << "\0" * omitlen << a2 << [a, b, c, d].pack('CCCC')
1831:           else
1832:             raise ArgumentError.new("not numeric IPv6 address: " + arg)
1833:           end
1834:         else
1835:           raise ArgumentError.new("not numeric IPv6 address: " + arg)
1836:         end
1837:         return IPv6.new(address)
1838:       else
1839:         raise ArgumentError.new("cannot interpret as IPv6 address: #{arg.inspect}")
1840:       end
1841:     end

[Source]

      # File lib/resolv.rb, line 1843
1843:     def initialize(address)
1844:       unless address.kind_of?(String) && address.length == 16
1845:         raise ArgumentError.new('IPv6 address must be 16 bytes')
1846:       end
1847:       @address = address
1848:     end

Public Instance methods

[Source]

      # File lib/resolv.rb, line 1869
1869:     def ==(other)
1870:       return @address == other.address
1871:     end

[Source]

      # File lib/resolv.rb, line 1873
1873:     def eql?(other)
1874:       return self == other
1875:     end

[Source]

      # File lib/resolv.rb, line 1877
1877:     def hash
1878:       return @address.hash
1879:     end

[Source]

      # File lib/resolv.rb, line 1859
1859:     def inspect
1860:       return "#<#{self.class} #{self.to_s}>"
1861:     end

[Source]

      # File lib/resolv.rb, line 1863
1863:     def to_name
1864:       # ip6.arpa should be searched too. [RFC3152]
1865:       return DNS::Name.new(
1866:         @address.unpack("H32")[0].split(//).reverse + ['ip6', 'int'])
1867:     end

[Source]

      # File lib/resolv.rb, line 1851
1851:     def to_s
1852:       address = sprintf("%X:%X:%X:%X:%X:%X:%X:%X", *@address.unpack("nnnnnnnn"))
1853:       unless address.sub!(/(^|:)0(:0)+(:|$)/, '::')
1854:         address.sub!(/(^|:)0(:|$)/, '::')
1855:       end
1856:       return address
1857:     end

[Validate]