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