dns/rawmsg.go

51 lines
1.4 KiB
Go
Raw Normal View History

2012-01-12 20:53:19 +11:00
// Copyright 2012 Miek Gieben. All rights reserved.
2011-08-08 22:09:05 +10:00
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package dns
2012-01-12 20:50:01 +11:00
// RawSetId sets the message ID in buf. The offset 'off' must
// be positioned at the beginning of the message.
func RawSetId(msg []byte, off int, id uint16) bool {
msg[off], msg[off+1] = packUint16(id)
2011-11-28 16:03:21 +11:00
return true
2011-08-09 00:29:13 +10:00
}
2012-01-12 02:02:05 +11:00
2012-01-13 07:10:29 +11:00
// RawSetRdlength sets the rdlength in the header of
2012-01-12 20:50:01 +11:00
// the RR. The offset 'off' must be positioned at the
2012-01-13 07:10:29 +11:00
// start of the header of the RR, 'end' must be the
// end of the RR.
func RawSetRdlength(msg []byte, off, end int) bool {
// We are at the start of the header, walk the domainname (might be compressed)
2012-01-12 02:02:05 +11:00
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:
2012-01-13 07:10:29 +11:00
// pointer, next byte included, ends domainname
2012-01-12 02:02:05 +11:00
off++
break Loop
}
}
2012-01-13 07:10:29 +11:00
// 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.
2012-01-12 02:02:05 +11:00
off += 2 + 2 + 4
if off+1 > len(msg) {
return false
}
2012-01-13 07:10:29 +11:00
//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)))
2012-01-12 02:02:05 +11:00
return true
}