diff options
Diffstat (limited to 'middleware/file/closest.go')
-rw-r--r-- | middleware/file/closest.go | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/middleware/file/closest.go b/middleware/file/closest.go index daee27314..8f9d9a8ba 100644 --- a/middleware/file/closest.go +++ b/middleware/file/closest.go @@ -4,13 +4,19 @@ import "github.com/miekg/dns" // ClosestEncloser returns the closest encloser for rr. func (z *Zone) ClosestEncloser(rr dns.RR) string { - elem := z.Tree.Prev(rr) - if elem == nil { - // SOA? - return "" - } - for _, r := range elem.All() { - return r.Header().Name + // tree/tree.go does not store a parent *Node pointer, so we can't + // just follow up the tree. TODO(miek): fix. + + offset, end := dns.NextLabel(rr.Header().Name, 0) + for !end { + elem := z.Tree.Get(rr) + if elem != nil { + return elem.Name() + } + rr.Header().Name = rr.Header().Name[offset:] + + offset, end = dns.NextLabel(rr.Header().Name, offset) } - return "" + + return z.SOA.Header().Name } |