summaryrefslogtreecommitdiff
path: root/internal/dns/rr_soa.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/dns/rr_soa.go')
-rw-r--r--internal/dns/rr_soa.go65
1 files changed, 65 insertions, 0 deletions
diff --git a/internal/dns/rr_soa.go b/internal/dns/rr_soa.go
new file mode 100644
index 0000000..dca4baf
--- /dev/null
+++ b/internal/dns/rr_soa.go
@@ -0,0 +1,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)
+}