class PacketGen::Header::DNS::Name

DNS Name, defined as a suite of labels. A label is of type {Types::IntString}. @author Sylvain Daubert

Constants

POINTER_MASK

Mask to decode a pointer on another label

Attributes

dns[RW]

@return [DNS]

Public Class Methods

new() click to toggle source
Calls superclass method
# File lib/packetgen/header/dns/name.rb, line 20
def initialize
  super
  @pointer = nil
  @pointer_name = nil
end

Public Instance Methods

clear() click to toggle source

Clear name

@return [void]
Calls superclass method
# File lib/packetgen/header/dns/name.rb, line 48
def clear
  super
  @pointer = nil
  @pointer_name = nil
end
from_human(str) click to toggle source

Read a set of labels form a dotted string @param [String] str @return [Name] self

# File lib/packetgen/header/dns/name.rb, line 36
def from_human(str)
  clear
  return self if str.nil?

  str.split('.').each do |label|
    self << Types::IntString.new(string: label)
  end
  self << Types::IntString.new
end
read(str) click to toggle source

Read a sequence of label from a string @param [String] str binary string @return [Name] self

# File lib/packetgen/header/dns/name.rb, line 57
def read(str)
  clear
  return self if str.nil?

  PacketGen.force_binary str
  start = 0
  loop do
    index = str[start, 2].unpack1('n')
    if pointer? index
      # Pointer on another label
      @pointer = str[start, 2]
      break
    else
      label = add_label_from(str[start..-1])
      start += label.sz
      break if label.length.zero? || str[start..-1].length.zero?
    end
  end
  # force resolution of compressed names
  name_from_pointer
  self
end
to_human() click to toggle source

Get a human readable string @return [String]

# File lib/packetgen/header/dns/name.rb, line 88
def to_human
  ary = map(&:string)
  np = name_from_pointer
  ary << np if np
  str = ary.join('.')
  str.empty? ? '.' : str
end
to_s() click to toggle source

Get options binary string @return [String]

Calls superclass method
# File lib/packetgen/header/dns/name.rb, line 82
def to_s
  super << @pointer.to_s
end

Private Instance Methods

add_label_from(str) click to toggle source
# File lib/packetgen/header/dns/name.rb, line 120
def add_label_from(str)
  label = Types::IntString.new
  label.read(str)
  self << label
  label
end
name_from_pointer() click to toggle source
# File lib/packetgen/header/dns/name.rb, line 104
def name_from_pointer
  return nil unless @pointer
  return @pointer_name if @pointer_name

  index = @pointer.unpack1('n')
  mask = ~POINTER_MASK & 0xffff
  ptr = index & mask
  name = Name.new
  name.dns = @dns
  @pointer_name = name.read(self.dns.to_s[ptr..-1]).to_human
end
pointer?(index) click to toggle source
# File lib/packetgen/header/dns/name.rb, line 98
def pointer?(index)
  return false if index.nil?

  index & POINTER_MASK == POINTER_MASK
end
record_from_hash(_hsh) click to toggle source
# File lib/packetgen/header/dns/name.rb, line 116
def record_from_hash(_hsh)
  raise NotImplementedError, "not supported by #{self.class}"
end