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 1843
1843:     def self.create(arg)
1844:       case arg
1845:       when IPv6
1846:         return arg
1847:       when String
1848:         address = ''
1849:         if Regex_8Hex =~ arg
1850:           arg.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
1851:         elsif Regex_CompressedHex =~ arg
1852:           prefix = $1
1853:           suffix = $2
1854:           a1 = ''
1855:           a2 = ''
1856:           prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
1857:           suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
1858:           omitlen = 16 - a1.length - a2.length
1859:           address << a1 << "\0" * omitlen << a2
1860:         elsif Regex_6Hex4Dec =~ arg
1861:           prefix, a, b, c, d = $1, $2.to_i, $3.to_i, $4.to_i, $5.to_i
1862:           if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
1863:             prefix.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
1864:             address << [a, b, c, d].pack('CCCC')
1865:           else
1866:             raise ArgumentError.new("not numeric IPv6 address: " + arg)
1867:           end
1868:         elsif Regex_CompressedHex4Dec =~ arg
1869:           prefix, suffix, a, b, c, d = $1, $2, $3.to_i, $4.to_i, $5.to_i, $6.to_i
1870:           if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
1871:             a1 = ''
1872:             a2 = ''
1873:             prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
1874:             suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
1875:             omitlen = 12 - a1.length - a2.length
1876:             address << a1 << "\0" * omitlen << a2 << [a, b, c, d].pack('CCCC')
1877:           else
1878:             raise ArgumentError.new("not numeric IPv6 address: " + arg)
1879:           end
1880:         else
1881:           raise ArgumentError.new("not numeric IPv6 address: " + arg)
1882:         end
1883:         return IPv6.new(address)
1884:       else
1885:         raise ArgumentError.new("cannot interpret as IPv6 address: #{arg.inspect}")
1886:       end
1887:     end

[Source]

      # File lib/resolv.rb, line 1889
1889:     def initialize(address)
1890:       unless address.kind_of?(String) && address.length == 16
1891:         raise ArgumentError.new('IPv6 address must be 16 bytes')
1892:       end
1893:       @address = address
1894:     end

Public Instance methods

[Source]

      # File lib/resolv.rb, line 1915
1915:     def ==(other)
1916:       return @address == other.address
1917:     end

[Source]

      # File lib/resolv.rb, line 1919
1919:     def eql?(other)
1920:       return self == other
1921:     end

[Source]

      # File lib/resolv.rb, line 1923
1923:     def hash
1924:       return @address.hash
1925:     end

[Source]

      # File lib/resolv.rb, line 1905
1905:     def inspect
1906:       return "#<#{self.class} #{self.to_s}>"
1907:     end

[Source]

      # File lib/resolv.rb, line 1909
1909:     def to_name
1910:       # ip6.arpa should be searched too. [RFC3152]
1911:       return DNS::Name.new(
1912:         @address.unpack("H32")[0].split(//).reverse + ['ip6', 'int'])
1913:     end

[Source]

      # File lib/resolv.rb, line 1897
1897:     def to_s
1898:       address = sprintf("%X:%X:%X:%X:%X:%X:%X:%X", *@address.unpack("nnnnnnnn"))
1899:       unless address.sub!(/(^|:)0(:0)+(:|$)/, '::')
1900:         address.sub!(/(^|:)0(:|$)/, '::')
1901:       end
1902:       return address
1903:     end

[Validate]