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)
}
|