a go dns packet parser

Merge pull request 'add stringer interface' (#2) from feature/string into main

Reviewed-on: https://code.kiri.systems/kiri/magna/pulls/2

blu 75c7f2ce f1e94a91

+69
resource_record.go
···
import (
"encoding/binary"
+
"fmt"
"net"
"strings"
)
···
func (a *A) Encode(bytes []byte, offsets *map[string]uint8) []byte {
return append(bytes, a.Address.To4()...)
+
}
+
+
func (a A) String() string {
+
return a.Address.String()
}
func (ns *NS) Decode(buf []byte, offset int, rdlength int) (int, error) {
···
func (ns *NS) Encode(bytes []byte, offsets *map[string]uint8) []byte {
return append(bytes, encode_domain(bytes, ns.NSDName, offsets)...)
+
}
+
+
func (ns NS) String() string {
+
return ns.NSDName
}
func (md *MD) Decode(buf []byte, offset int, rdlength int) (int, error) {
···
return append(bytes, encode_domain(bytes, md.MADName, offsets)...)
}
+
func (md MD) String() string {
+
return md.MADName
+
}
+
func (mf *MF) Decode(buf []byte, offset int, rdlength int) (int, error) {
var err error
mf.MADName, offset, err = decode_domain(buf, offset)
···
return append(bytes, encode_domain(bytes, mf.MADName, offsets)...)
}
+
func (mf MF) String() string {
+
return mf.MADName
+
}
+
func (c *CNAME) Decode(buf []byte, offset int, rdlength int) (int, error) {
var err error
c.CName, offset, err = decode_domain(buf, offset)
···
return append(bytes, encode_domain(bytes, c.CName, offsets)...)
}
+
func (c CNAME) String() string {
+
return c.CName
+
}
+
func (soa *SOA) Decode(buf []byte, offset int, rdlength int) (int, error) {
var err error
soa.MName, offset, err = decode_domain(buf, offset)
···
return bytes
}
+
func (soa SOA) String() string {
+
return fmt.Sprintf("%s %s %d %d %d %d %d", soa.MName, soa.RName, soa.Serial, soa.Refresh, soa.Retry, soa.Expire, soa.Minimum)
+
}
+
func (mb *MB) Decode(buf []byte, offset int, rdlength int) (int, error) {
madname, offset, err := decode_domain(buf, offset)
if err != nil {
···
return append(bytes, encode_domain(bytes, mb.MADName, offsets)...)
}
+
func (mb MB) String() string {
+
return mb.MADName
+
}
+
func (mg *MG) Decode(buf []byte, offset int, rdlength int) (int, error) {
var err error
mg.MGMName, offset, err = decode_domain(buf, offset)
···
return append(bytes, encode_domain(bytes, mg.MGMName, offsets)...)
}
+
func (mg MG) String() string {
+
return mg.MGMName
+
}
+
func (mr *MR) Decode(buf []byte, offset int, rdlength int) (int, error) {
var err error
mr.NEWName, offset, err = decode_domain(buf, offset)
···
return append(bytes, encode_domain(bytes, mr.NEWName, offsets)...)
}
+
func (mr MR) String() string {
+
return mr.NEWName
+
}
+
func (null *NULL) Decode(buf []byte, offset int, rdlength int) (int, error) {
var err error
null.Anything, offset, err = getSlice(buf, offset, int(rdlength))
···
func (null *NULL) Encode(bytes []byte, offsets *map[string]uint8) []byte {
return append(bytes, null.Anything...)
+
}
+
+
func (null NULL) String() string {
+
return string(null.Anything)
}
func (wks *WKS) Decode(buf []byte, offset int, rdlength int) (int, error) {
···
return bytes
}
+
func (wks WKS) String() string {
+
return fmt.Sprintf("%s %d %s", wks.Address.String(), wks.Protocol, wks.BitMap)
+
}
+
func (ptr *PTR) Decode(buf []byte, offset int, rdlength int) (int, error) {
var err error
ptr.PTRDName, offset, err = decode_domain(buf, offset)
···
func (ptr *PTR) Encode(bytes []byte, offsets *map[string]uint8) []byte {
return append(bytes, encode_domain(bytes, ptr.PTRDName, offsets)...)
+
}
+
+
func (ptr PTR) String() string {
+
return ptr.PTRDName
}
func (hinfo *HINFO) Decode(buf []byte, offset int, rdlength int) (int, error) {
···
return bytes
}
+
func (hinfo HINFO) String() string {
+
return hinfo.OS + " " + hinfo.CPU
+
}
+
func (minfo *MINFO) Decode(buf []byte, offset int, rdlength int) (int, error) {
var err error
···
bytes = append(bytes, encode_domain(bytes, minfo.EMailBx, offsets)...)
return bytes
+
}
+
+
func (minfo MINFO) String() string {
+
return minfo.RMailBx + " " + minfo.EMailBx
}
func (mx *MX) Decode(buf []byte, offset int, rdlength int) (int, error) {
···
bytes = append(bytes, encode_domain(bytes, mx.Exchange, offsets)...)
return bytes
+
}
+
+
func (mx MX) String() string {
+
return fmt.Sprintf("%d %s", mx.Preference, mx.Exchange)
}
func (txt *TXT) Decode(buf []byte, offset int, rdlength int) (int, error) {
···
return append(bytes, []byte(txt.TxtData)...)
}
+
func (txt TXT) String() string {
+
return txt.TxtData
+
}
+
func (r *Reserved) Decode(buf []byte, offset int, rdlength int) (int, error) {
var err error
r.Bytes, offset, err = getSlice(buf, offset, int(rdlength))
···
func (r *Reserved) Encode(bytes []byte, offsets *map[string]uint8) []byte {
return append(bytes, r.Bytes...)
+
}
+
+
func (r Reserved) String() string {
+
return string(r.Bytes)
}
// Decode decodes a resource record from buf at the offset.
+1
types.go
···
type ResourceRecordData interface {
Decode([]byte, int, int) (int, error)
Encode([]byte, *map[string]uint8) []byte
+
String() string
}
// ResourceRecord represents DNS records.