diff options
Diffstat (limited to 'internal/dns/rr_txt.go')
| -rw-r--r-- | internal/dns/rr_txt.go | 43 |
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) +} |
