56 lines
1.2 KiB
Go
56 lines
1.2 KiB
Go
package nameserver
|
|
|
|
import (
|
|
"github.com/miekg/dns"
|
|
"net"
|
|
)
|
|
|
|
const (
|
|
localTTL uint32 = 300 // somewhat arbitrary; we don't expect anyone
|
|
// downstream to cache results
|
|
)
|
|
|
|
func makeHeader(r *dns.Msg, q *dns.Question) *dns.RR_Header {
|
|
return &dns.RR_Header{
|
|
Name: q.Name, Rrtype: q.Qtype,
|
|
Class: dns.ClassINET, Ttl: localTTL}
|
|
}
|
|
|
|
func makeReply(r *dns.Msg, as []dns.RR) *dns.Msg {
|
|
m := new(dns.Msg)
|
|
m.SetReply(r)
|
|
m.RecursionAvailable = true
|
|
m.Answer = as
|
|
return m
|
|
}
|
|
|
|
func makeAddressReply(r *dns.Msg, q *dns.Question, addrs []net.IP) *dns.Msg {
|
|
answers := make([]dns.RR, len(addrs))
|
|
header := makeHeader(r, q)
|
|
count := 0
|
|
for _, addr := range addrs {
|
|
switch q.Qtype {
|
|
case dns.TypeA:
|
|
if ip4 := addr.To4(); ip4 != nil {
|
|
answers[count] = &dns.A{*header, addr}
|
|
count++
|
|
}
|
|
case dns.TypeAAAA:
|
|
if ip4 := addr.To4(); ip4 == nil {
|
|
answers[count] = &dns.AAAA{*header, addr}
|
|
count++
|
|
}
|
|
}
|
|
}
|
|
return makeReply(r, answers[:count])
|
|
}
|
|
|
|
func makePTRReply(r *dns.Msg, q *dns.Question, names []string) *dns.Msg {
|
|
answers := make([]dns.RR, len(names))
|
|
header := makeHeader(r, q)
|
|
for i, name := range names {
|
|
answers[i] = &dns.PTR{*header, name}
|
|
}
|
|
return makeReply(r, answers)
|
|
}
|