dns

DNS client and server implementations using the Go project's dnsmessage package
Log | Files | Refs | README | LICENSE

cache.go (904B)


      1 package main
      2 
      3 import (
      4 	"golang.org/x/net/dns/dnsmessage"
      5 	"sync"
      6 )
      7 
      8 var cache = struct {
      9 	m map[dnsmessage.Name]map[dnsmessage.Type][]dnsmessage.Resource
     10 	sync.RWMutex
     11 }{m: make(map[dnsmessage.Name]map[dnsmessage.Type][]dnsmessage.Resource)}
     12 
     13 func lookup(n dnsmessage.Name, t dnsmessage.Type) ([]dnsmessage.Resource, bool) {
     14 	cache.RLock()
     15 	if rr, ok := cache.m[n][t]; ok {
     16 		cache.RUnlock()
     17 		if expired(n, t) {
     18 			cache.Lock()
     19 			delete(cache.m[n], t)
     20 			cache.Unlock()
     21 			return nil, false
     22 		}
     23 		return rr, true
     24 	}
     25 	l := len(cache.m[n])
     26 	cache.RUnlock()
     27 	if l < 1 {
     28 		cache.Lock()
     29 		cache.m[n] = make(map[dnsmessage.Type][]dnsmessage.Resource)
     30 		cache.Unlock()
     31 	}
     32 	return nil, false
     33 }
     34 
     35 func insert(n dnsmessage.Name, t dnsmessage.Type, rrs []dnsmessage.Resource) {
     36 	cache.Lock()
     37 	cache.m[n][t] = rrs
     38 	cache.Unlock()
     39 	return
     40 }
     41 
     42 func expired(n dnsmessage.Name, t dnsmessage.Type) bool { return false }