From 76efc275a39bb2a9c0f9c237d6d509b37a3d6298 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Wed, 11 Jan 2012 16:02:05 +0100 Subject: [PATCH] Add RawSetRdlength back in --- rawmsg.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/rawmsg.go b/rawmsg.go index 8f800548..e5478031 100644 --- a/rawmsg.go +++ b/rawmsg.go @@ -12,3 +12,41 @@ func RawSetId(msg []byte, off int, id uint16) bool { msg[off], msg[off+1] = packUint16(id) return true } + +// RawSetRdLength set the rdlength +func RawSetRdLength(msg []byte, off, end int) bool { + // We are at the start of the header, walk the + // domainname (might be compressed), and set the + // length +Loop: + for { + if off > len(msg) { + return false + } + c := int(msg[off]) + off++ + switch c & 0xC00 { + case 0x00: + if c == 0x00 { + // End of the domainname + break Loop + } + + case 0xC0: + // pointer, next byte included, ends domainnames + off++ + break Loop + } + } + // The domainname has been seen, we at the start + // of the fixed part in the header + // type is 2 bytes, class is 2 bytes, ttl 4 and then 2 bytes for the length + off += 2 + 2 + 4 + if off+1 > len(msg) { + return false + } + //off+1 is the end of the header, 'end' is the end of the rr + //so 'end' - 'off+2' is the lenght of the rdata + msg[off], msg[off+1] = packUint16(uint16(end - (off+2))) + return true +}