diff options
Diffstat (limited to 'dhcpv6/options/rfc1035label.go')
-rw-r--r-- | dhcpv6/options/rfc1035label.go | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/dhcpv6/options/rfc1035label.go b/dhcpv6/options/rfc1035label.go new file mode 100644 index 0000000..0d2cff3 --- /dev/null +++ b/dhcpv6/options/rfc1035label.go @@ -0,0 +1,54 @@ +package options + +import ( + "fmt" + "strings" +) + +func LabelsFromBytes(buf []byte) ([]string, error) { + var ( + pos = 0 + domains = make([]string, 0) + label = "" + ) + for { + if pos >= len(buf) { + return domains, nil + } + length := int(buf[pos]) + pos++ + if length == 0 { + domains = append(domains, label) + label = "" + } + if len(buf)-pos < length { + return nil, fmt.Errorf("DomainNamesFromBytes: invalid short label length") + } + if label != "" { + label += "." + } + label += string(buf[pos : pos+length]) + pos += length + } + return domains, nil +} + +func LabelToBytes(label string) []byte { + var encodedLabel []byte + if len(label) == 0 { + return []byte{0} + } + for _, part := range strings.Split(label, ".") { + encodedLabel = append(encodedLabel, byte(len(part))) + encodedLabel = append(encodedLabel, []byte(part)...) + } + return append(encodedLabel, 0) +} + +func LabelsToBytes(labels []string) []byte { + var encodedLabels []byte + for _, label := range labels { + encodedLabels = append(encodedLabels, LabelToBytes(label)...) + } + return encodedLabels +} |