Resolv::DNS::Message (Class)

In: resolv.rb
Parent: Object

Attributes

aa  [RW] 
additional  [R] 
answer  [R] 
authority  [R] 
id  [RW] 
opcode  [RW] 
qr  [RW] 
question  [R] 
ra  [RW] 
rcode  [RW] 
rd  [RW] 
tc  [RW] 

Public Class methods

[Source]

# File resolv.rb, line 1170
      def Message.decode(m)
        o = Message.new(0)
        MessageDecoder.new(m) {|msg|
          id, flag, qdcount, ancount, nscount, arcount =
            msg.get_unpack('nnnnnn')
          o.id = id
          o.qr = (flag >> 15) & 1
          o.opcode = (flag >> 11) & 15
          o.aa = (flag >> 10) & 1
          o.tc = (flag >> 9) & 1
          o.rd = (flag >> 8) & 1
          o.ra = (flag >> 7) & 1
          o.rcode = flag & 15
          (1..qdcount).each {
            name, typeclass = msg.get_question
            o.add_question(name, typeclass)
          }
          (1..ancount).each {
            name, ttl, data = msg.get_rr
            o.add_answer(name, ttl, data)
          }
          (1..nscount).each {
            name, ttl, data = msg.get_rr
            o.add_authority(name, ttl, data)
          }
          (1..arcount).each {
            name, ttl, data = msg.get_rr
            o.add_additional(name, ttl, data)
          }
        }
        return o
      end

[Source]

# File resolv.rb, line 1004
      def initialize(id = (@@identifier += 1) & 0xffff)
        @id = id
        @qr = 0
        @opcode = 0
        @aa = 0
        @tc = 0
        @rd = 0 # recursion desired

        @ra = 0 # recursion available

        @rcode = 0
        @question = []
        @answer = []
        @authority = []
        @additional = []
      end

Public Instance methods

[Source]

# File resolv.rb, line 1022
      def ==(other)
        return @id == other.id &&
               @qr == other.qr &&
               @opcode == other.opcode &&
               @aa == other.aa &&
               @tc == other.tc &&
               @rd == other.rd &&
               @ra == other.ra &&
               @rcode == other.rcode &&
               @question == other.question &&
               @answer == other.answer &&
               @authority == other.authority &&
               @additional == other.additional
      end

[Source]

# File resolv.rb, line 1067
      def add_additional(name, ttl, data)
        @additional << [Name.create(name), ttl, data]
      end

[Source]

# File resolv.rb, line 1047
      def add_answer(name, ttl, data)
        @answer << [Name.create(name), ttl, data]
      end

[Source]

# File resolv.rb, line 1057
      def add_authority(name, ttl, data)
        @authority << [Name.create(name), ttl, data]
      end

[Source]

# File resolv.rb, line 1037
      def add_question(name, typeclass)
        @question << [Name.create(name), typeclass]
      end

[Source]

# File resolv.rb, line 1071
      def each_additional
        @additional.each {|name, ttl, data|
          yield name, ttl, data
        }
      end

[Source]

# File resolv.rb, line 1051
      def each_answer
        @answer.each {|name, ttl, data|
          yield name, ttl, data
        }
      end

[Source]

# File resolv.rb, line 1061
      def each_authority
        @authority.each {|name, ttl, data|
          yield name, ttl, data
        }
      end

[Source]

# File resolv.rb, line 1041
      def each_question
        @question.each {|name, typeclass|
          yield name, typeclass
        }
      end

[Source]

# File resolv.rb, line 1077
      def each_resource
        each_answer {|name, ttl, data| yield name, ttl, data}
        each_authority {|name, ttl, data| yield name, ttl, data}
        each_additional {|name, ttl, data| yield name, ttl, data}
      end

[Source]

# File resolv.rb, line 1083
      def encode
        return MessageEncoder.new {|msg|
          msg.put_pack('nnnnnn',
            @id,
            (@qr & 1) << 15 |
            (@opcode & 15) << 11 |
            (@aa & 1) << 10 |
            (@tc & 1) << 9 |
            (@rd & 1) << 8 |
            (@ra & 1) << 7 |
            (@rcode & 15),
            @question.length,
            @answer.length,
            @authority.length,
            @additional.length)
          @question.each {|q|
            name, typeclass = q
            msg.put_name(name)
            msg.put_pack('nn', typeclass::TypeValue, typeclass::ClassValue)
          }
          [@answer, @authority, @additional].each {|rr|
            rr.each {|r|
              name, ttl, data = r
              msg.put_name(name)
              msg.put_pack('nnN', data.class::TypeValue, data.class::ClassValue, ttl)
              msg.put_length16 {data.encode_rdata(msg)}
            }
          }
        }.to_s
      end

[Validate]