Merge branch 'dev' of github.com:miekg/dns into dev

This commit is contained in:
Miek Gieben 2012-07-16 19:11:46 +02:00
commit b5720f99ed
2 changed files with 42 additions and 3 deletions

View File

@ -38,6 +38,9 @@ func SplitLabels(s string) []string {
// //
// www.miek.nl. and miek.nl. have two labels in common: miek and nl // www.miek.nl. and miek.nl. have two labels in common: miek and nl
// www.miek.nl. and www.bla.nl. have one label in common: nl // www.miek.nl. and www.bla.nl. have one label in common: nl
//
// Domain s1 is a subdomain of s2 if
// CompareLabels(s1, s2) == LenLabels(s1)
func CompareLabels(s1, s2 string) (n int) { func CompareLabels(s1, s2 string) (n int) {
l1 := SplitLabels(s1) l1 := SplitLabels(s1)
l2 := SplitLabels(s2) l2 := SplitLabels(s2)
@ -58,3 +61,27 @@ func CompareLabels(s1, s2 string) (n int) {
} }
return return
} }
// LenLabels returns the number of labels in a domain name
func LenLabels(s string) (labels int) {
if s == "." {
return
}
last := byte('.')
lastlast := byte('.')
s = Fqdn(s) // Make fully qualified
for i := 0; i < len(s); i++ {
if s[i] == '.' {
if last == '\\' {
if lastlast != '\\' {
// do nothing
continue
}
}
labels++
}
lastlast = last
last = s[i]
}
return
}

18
zone.go
View File

@ -3,7 +3,7 @@ package dns
// A structure for handling zone data // A structure for handling zone data
import ( import (
"github.com/sauerbraten/radix" "radix"
) )
// Zone represents a DNS zone. // Zone represents a DNS zone.
@ -34,6 +34,8 @@ func NewZone(origin string) *Zone {
} }
// Insert inserts an RR into the zone. Overwrites. // Insert inserts an RR into the zone. Overwrites.
// Out-of-zone data
// Glue
func (z *Zone) Insert(r RR) { func (z *Zone) Insert(r RR) {
zd := z.Radix.Find(r.Header().Name) zd := z.Radix.Find(r.Header().Name)
if zd == nil { if zd == nil {
@ -46,19 +48,29 @@ func (z *Zone) Insert(r RR) {
zd.Signatures = append(zd.Signatures, r.(*RR_RRSIG)) zd.Signatures = append(zd.Signatures, r.(*RR_RRSIG))
default: default:
zd.RR[t] = append(zd.RR[t], r) zd.RR[t] = append(zd.RR[t], r)
glueCheck(r)
} }
z.Radix.Insert(r.Header().Name, zd) z.Radix.Insert(r.Header().Name, zd)
return return
} }
switch t := r.Header().Rrtype; t { switch t := r.Header().Rrtype; t {
case TypeRRSIG: case TypeRRSIG:
zd.(*ZoneData).Signatures = append(zd.(*ZoneData).Signatures, r.(*RR_RRSIG)) zd.Value.(*ZoneData).Signatures = append(zd.Value.(*ZoneData).Signatures, r.(*RR_RRSIG))
default: default:
zd.(*ZoneData).RR[t] = append(zd.(*ZoneData).RR[t], r) zd.Value.(*ZoneData).RR[t] = append(zd.Value.(*ZoneData).RR[t], r)
} }
return return
} }
func glueCheck(r RR) {
if n, ok := r.(*RR_NS); ok {
// Check if glue would be needed
if CompareLabels(r.Header().Name, n.Ns) == LenLabels(r.Header().Name) {
println("glue needed?", r.Header().Name, n.Ns)
}
}
}
func (z *Zone) Remove(r RR) { func (z *Zone) Remove(r RR) {
} }