summaryrefslogtreecommitdiff
path: root/internal/dns/rr_txt.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/dns/rr_txt.go')
-rw-r--r--internal/dns/rr_txt.go43
1 files changed, 43 insertions, 0 deletions
diff --git a/internal/dns/rr_txt.go b/internal/dns/rr_txt.go
new file mode 100644
index 0000000..f225afa
--- /dev/null
+++ b/internal/dns/rr_txt.go
@@ -0,0 +1,43 @@
+package dns
+
+import "fmt"
+
+type TXT struct {
+ Txt []string
+}
+
+func (t *TXT) Type() uint16 {
+ return TypeTXT
+}
+
+func (t *TXT) Pack(p *packer) error {
+ for _, s := range t.Txt {
+ if len(s) > 255 {
+ return fmt.Errorf("dns: txt string > 255 octets")
+ }
+ p.buf = append(p.buf, byte(len(s)))
+ p.buf = append(p.buf, s...)
+ }
+ return nil
+}
+
+func (t *TXT) Unpack(u *unpacker, length uint16) error {
+ end := u.off + int(length)
+ for u.off < end {
+ if u.off >= len(u.buf) {
+ return fmt.Errorf("dns: short txt")
+ }
+ l := int(u.buf[u.off])
+ u.off++
+ if u.off+l > end {
+ return fmt.Errorf("dns: txt string overflow")
+ }
+ t.Txt = append(t.Txt, string(u.buf[u.off:u.off+l]))
+ u.off += l
+ }
+ return nil
+}
+
+func (t *TXT) String() string {
+ return fmt.Sprintf("%v", t.Txt)
+}