summaryrefslogtreecommitdiff
path: root/internal/dns/rr_soa.go
blob: dca4baf832a2477ca2e50a181de3a23643ac2bef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package dns

import "fmt"

// https://datatracker.ietf.org/doc/html/rfc1035#section-3.3.13
type SOA struct {
	Mname   Name
	Rname   Name
	Serial  uint32
	Refresh uint32
	Retry   uint32
	Expire  uint32
	Minimum uint32
}

func (s *SOA) Type() uint16 { return TypeSOA }

func (s *SOA) Pack(p *packer) error {
	if err := p.writeName(s.Mname); err != nil {
		return err
	}
	if err := p.writeName(s.Rname); err != nil {
		return err
	}
	p.writeUint32(s.Serial)
	p.writeUint32(s.Refresh)
	p.writeUint32(s.Retry)
	p.writeUint32(s.Expire)
	p.writeUint32(s.Minimum)
	return nil
}

func (s *SOA) Unpack(u *unpacker, length uint16) error {
	var err error
	s.Mname, err = u.readName()
	if err != nil {
		return err
	}
	s.Rname, err = u.readName()
	if err != nil {
		return err
	}
	s.Serial, err = u.readUint32()
	if err != nil {
		return err
	}
	s.Refresh, err = u.readUint32()
	if err != nil {
		return err
	}
	s.Retry, err = u.readUint32()
	if err != nil {
		return err
	}
	s.Expire, err = u.readUint32()
	if err != nil {
		return err
	}
	s.Minimum, err = u.readUint32()
	return err
}

func (s *SOA) String() string {
	return fmt.Sprintf("%s %s %d %d %d %d %d", s.Mname, s.Rname, s.Serial, s.Refresh, s.Retry, s.Expire, s.Minimum)
}