forked from TrueCloudLab/distribution
a685e3fc98
Vndr has a simpler configuration and allows pointing to forked packages. Additionally other docker projects are now using vndr making vendoring in distribution more consistent. Updates letsencrypt to use fork. No longer uses sub-vendored packages. Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
87 lines
2.3 KiB
Go
87 lines
2.3 KiB
Go
package dns
|
|
|
|
import (
|
|
"net"
|
|
"reflect"
|
|
"strconv"
|
|
)
|
|
|
|
// NumField returns the number of rdata fields r has.
|
|
func NumField(r RR) int {
|
|
return reflect.ValueOf(r).Elem().NumField() - 1 // Remove RR_Header
|
|
}
|
|
|
|
// Field returns the rdata field i as a string. Fields are indexed starting from 1.
|
|
// RR types that holds slice data, for instance the NSEC type bitmap will return a single
|
|
// string where the types are concatenated using a space.
|
|
// Accessing non existing fields will cause a panic.
|
|
func Field(r RR, i int) string {
|
|
if i == 0 {
|
|
return ""
|
|
}
|
|
d := reflect.ValueOf(r).Elem().Field(i)
|
|
switch k := d.Kind(); k {
|
|
case reflect.String:
|
|
return d.String()
|
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
return strconv.FormatInt(d.Int(), 10)
|
|
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
|
return strconv.FormatUint(d.Uint(), 10)
|
|
case reflect.Slice:
|
|
switch reflect.ValueOf(r).Elem().Type().Field(i).Tag {
|
|
case `dns:"a"`:
|
|
// TODO(miek): Hmm store this as 16 bytes
|
|
if d.Len() < net.IPv6len {
|
|
return net.IPv4(byte(d.Index(0).Uint()),
|
|
byte(d.Index(1).Uint()),
|
|
byte(d.Index(2).Uint()),
|
|
byte(d.Index(3).Uint())).String()
|
|
}
|
|
return net.IPv4(byte(d.Index(12).Uint()),
|
|
byte(d.Index(13).Uint()),
|
|
byte(d.Index(14).Uint()),
|
|
byte(d.Index(15).Uint())).String()
|
|
case `dns:"aaaa"`:
|
|
return net.IP{
|
|
byte(d.Index(0).Uint()),
|
|
byte(d.Index(1).Uint()),
|
|
byte(d.Index(2).Uint()),
|
|
byte(d.Index(3).Uint()),
|
|
byte(d.Index(4).Uint()),
|
|
byte(d.Index(5).Uint()),
|
|
byte(d.Index(6).Uint()),
|
|
byte(d.Index(7).Uint()),
|
|
byte(d.Index(8).Uint()),
|
|
byte(d.Index(9).Uint()),
|
|
byte(d.Index(10).Uint()),
|
|
byte(d.Index(11).Uint()),
|
|
byte(d.Index(12).Uint()),
|
|
byte(d.Index(13).Uint()),
|
|
byte(d.Index(14).Uint()),
|
|
byte(d.Index(15).Uint()),
|
|
}.String()
|
|
case `dns:"nsec"`:
|
|
if d.Len() == 0 {
|
|
return ""
|
|
}
|
|
s := Type(d.Index(0).Uint()).String()
|
|
for i := 1; i < d.Len(); i++ {
|
|
s += " " + Type(d.Index(i).Uint()).String()
|
|
}
|
|
return s
|
|
default:
|
|
// if it does not have a tag its a string slice
|
|
fallthrough
|
|
case `dns:"txt"`:
|
|
if d.Len() == 0 {
|
|
return ""
|
|
}
|
|
s := d.Index(0).String()
|
|
for i := 1; i < d.Len(); i++ {
|
|
s += " " + d.Index(i).String()
|
|
}
|
|
return s
|
|
}
|
|
}
|
|
return ""
|
|
}
|