func serve(w dns.ResponseWriter, r *dns.Msg, c *Cache) { switch { case r.IsNotify(): if *flaglog { log.Printf("fks-shield: notify/update") } fallthrough case r.IsUpdate(): client := new(dns.Client) if p, e := client.Exchange(r, *server); e == nil { w.WriteMsg(p) } return } if p := c.Find(r); p != nil { b := []byte{byte(r.MsgHdr.Id >> 8), byte(r.MsgHdr.Id)} p = append(b, p...) w.Write(p) return } // Cache miss client := new(dns.Client) if p, e := client.Exchange(r, *server); e == nil { // TODO(mg): If r has edns0 and p has not we create a mismatch here w.WriteMsg(p) c.Insert(p) return } else { log.Printf("fks-shield: failed to get answer " + e.Error()) m := new(dns.Msg) m.SetRcode(r, dns.RcodeServerFailure) w.WriteMsg(m) } }