123456789_123456789_123456789_123456789_123456789_

Class: Resolv::IPv6

Relationships & Source Files
Inherits: Object
Defined in: lib/resolv.rb

Overview

A DNS IPv6 address.

Constant Summary

Class Method Summary

Instance Attribute Summary

  • #address readonly

    The raw IPv6 address as a String.

Instance Method Summary

Constructor Details

.new(address) ⇒ IPv6

This method is for internal use only.
[ GitHub ]

  
# File 'lib/resolv.rb', line 2530

def initialize(address) # :nodoc:
  unless address.kind_of?(String) && address.length == 16
    raise ArgumentError.new('IPv6 address must be 16 bytes')
  end
  @address = address
end

Class Method Details

.create(arg)

Creates a new IPv6 address from arg which may be:

IPv6

returns arg.

String

arg must match one of the IPv6::Regex* constants

[ GitHub ]

  
# File 'lib/resolv.rb', line 2484

def self.create(arg)
  case arg
  when IPv6
    return arg
  when String
    address = ''.b
    if Regex_8Hex =~ arg
      arg.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
    elsif Regex_CompressedHex =~ arg
      prefix = $1
      suffix = $2
      a1 = ''.b
      a2 = ''.b
      prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
      suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
      omitlen = 16 - a1.length - a2.length
      address << a1 << "\0" * omitlen << a2
    elsif Regex_6Hex4Dec =~ arg
      prefix, a, b, c, d = $1, $2.to_i, $3.to_i, $4.to_i, $5.to_i
      if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
        prefix.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
        address << [a, b, c, d].pack('CCCC')
      else
        raise ArgumentError.new("not numeric IPv6 address: " + arg)
      end
    elsif Regex_CompressedHex4Dec =~ arg
      prefix, suffix, a, b, c, d = $1, $2, $3.to_i, $4.to_i, $5.to_i, $6.to_i
      if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
        a1 = ''.b
        a2 = ''.b
        prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
        suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
        omitlen = 12 - a1.length - a2.length
        address << a1 << "\0" * omitlen << a2 << [a, b, c, d].pack('CCCC')
      else
        raise ArgumentError.new("not numeric IPv6 address: " + arg)
      end
    else
      raise ArgumentError.new("not numeric IPv6 address: " + arg)
    end
    return IPv6.new(address)
  else
    raise ArgumentError.new("cannot interpret as IPv6 address: #{arg.inspect}")
  end
end

Instance Attribute Details

#address (readonly)

The raw IPv6 address as a String.

[ GitHub ]

  
# File 'lib/resolv.rb', line 2540

attr_reader :address

Instance Method Details

#==(other)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/resolv.rb', line 2564

def ==(other) # :nodoc:
  return @address == other.address
end

#eql?(other) ⇒ Boolean

This method is for internal use only.
[ GitHub ]

  
# File 'lib/resolv.rb', line 2568

def eql?(other) # :nodoc:
  return self == other
end

#hash

This method is for internal use only.
[ GitHub ]

  
# File 'lib/resolv.rb', line 2572

def hash # :nodoc:
  return @address.hash
end

#inspect

This method is for internal use only.
[ GitHub ]

  
# File 'lib/resolv.rb', line 2550

def inspect # :nodoc:
  return "#<#{self.class} #{self}>"
end

#to_name

Turns this IPv6 address into a DNS::Name.

[ GitHub ]

  
# File 'lib/resolv.rb', line 2559

def to_name
  return DNS::Name.new(
    @address.unpack("H32")[0].split(//).reverse + ['ip6', 'arpa'])
end

#to_s

This method is for internal use only.
[ GitHub ]

  
# File 'lib/resolv.rb', line 2542

def to_s # :nodoc:
  address = sprintf("%X:%X:%X:%X:%X:%X:%X:%X", *@address.unpack("nnnnnnnn"))
  unless address.sub!(/(^|:)0(:0)+(:|$)/, '::')
    address.sub!(/(^|:)0(:|$)/, '::')
  end
  return address
end