mirror of https://github.com/golang/go.git
net: return rooted DNS names on windows
This CL also changes windows LookupSRV to return _xmpp-server._tcp.google.com. as cname instead of google.com similar to linux. Otherwise TestLookupDots still fails. Updates #12193 (with plan9 still to do) Change-Id: Id225e15bee95037cdb4226803506cce690c5d341 Reviewed-on: https://go-review.googlesource.com/13887 Run-TryBot: Alex Brainman <alex.brainman@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
3afee4380b
commit
92cc3c4e76
|
|
@ -213,6 +213,17 @@ func newLookupPort(network, service string) (int, error) {
|
|||
return 0, &DNSError{Err: syscall.EINVAL.Error(), Name: network + "/" + service}
|
||||
}
|
||||
|
||||
// ensureEndDot adds '.' at the end of name unless it is already there.
|
||||
func ensureEndDot(name string) string {
|
||||
if name == "" {
|
||||
return "."
|
||||
}
|
||||
if name[len(name)-1] == '.' {
|
||||
return name
|
||||
}
|
||||
return name + "."
|
||||
}
|
||||
|
||||
func lookupCNAME(name string) (string, error) {
|
||||
acquireThread()
|
||||
defer releaseThread()
|
||||
|
|
@ -221,10 +232,7 @@ func lookupCNAME(name string) (string, error) {
|
|||
// windows returns DNS_INFO_NO_RECORDS if there are no CNAME-s
|
||||
if errno, ok := e.(syscall.Errno); ok && errno == syscall.DNS_INFO_NO_RECORDS {
|
||||
// if there are no aliases, the canonical name is the input name
|
||||
if name == "" || name[len(name)-1] != '.' {
|
||||
return name + ".", nil
|
||||
}
|
||||
return name, nil
|
||||
return ensureEndDot(name), nil
|
||||
}
|
||||
if e != nil {
|
||||
return "", &DNSError{Err: os.NewSyscallError("dnsquery", e).Error(), Name: name}
|
||||
|
|
@ -232,8 +240,8 @@ func lookupCNAME(name string) (string, error) {
|
|||
defer syscall.DnsRecordListFree(r, 1)
|
||||
|
||||
resolved := resolveCNAME(syscall.StringToUTF16Ptr(name), r)
|
||||
cname := syscall.UTF16ToString((*[256]uint16)(unsafe.Pointer(resolved))[:]) + "."
|
||||
return cname, nil
|
||||
cname := syscall.UTF16ToString((*[256]uint16)(unsafe.Pointer(resolved))[:])
|
||||
return ensureEndDot(cname), nil
|
||||
}
|
||||
|
||||
func lookupSRV(service, proto, name string) (string, []*SRV, error) {
|
||||
|
|
@ -255,10 +263,10 @@ func lookupSRV(service, proto, name string) (string, []*SRV, error) {
|
|||
srvs := make([]*SRV, 0, 10)
|
||||
for _, p := range validRecs(r, syscall.DNS_TYPE_SRV, target) {
|
||||
v := (*syscall.DNSSRVData)(unsafe.Pointer(&p.Data[0]))
|
||||
srvs = append(srvs, &SRV{syscall.UTF16ToString((*[256]uint16)(unsafe.Pointer(v.Target))[:]), v.Port, v.Priority, v.Weight})
|
||||
srvs = append(srvs, &SRV{ensureEndDot(syscall.UTF16ToString((*[256]uint16)(unsafe.Pointer(v.Target))[:])), v.Port, v.Priority, v.Weight})
|
||||
}
|
||||
byPriorityWeight(srvs).sort()
|
||||
return name, srvs, nil
|
||||
return ensureEndDot(target), srvs, nil
|
||||
}
|
||||
|
||||
func lookupMX(name string) ([]*MX, error) {
|
||||
|
|
@ -274,7 +282,7 @@ func lookupMX(name string) ([]*MX, error) {
|
|||
mxs := make([]*MX, 0, 10)
|
||||
for _, p := range validRecs(r, syscall.DNS_TYPE_MX, name) {
|
||||
v := (*syscall.DNSMXData)(unsafe.Pointer(&p.Data[0]))
|
||||
mxs = append(mxs, &MX{syscall.UTF16ToString((*[256]uint16)(unsafe.Pointer(v.NameExchange))[:]) + ".", v.Preference})
|
||||
mxs = append(mxs, &MX{ensureEndDot(syscall.UTF16ToString((*[256]uint16)(unsafe.Pointer(v.NameExchange))[:])), v.Preference})
|
||||
}
|
||||
byPref(mxs).sort()
|
||||
return mxs, nil
|
||||
|
|
@ -293,7 +301,7 @@ func lookupNS(name string) ([]*NS, error) {
|
|||
nss := make([]*NS, 0, 10)
|
||||
for _, p := range validRecs(r, syscall.DNS_TYPE_NS, name) {
|
||||
v := (*syscall.DNSPTRData)(unsafe.Pointer(&p.Data[0]))
|
||||
nss = append(nss, &NS{syscall.UTF16ToString((*[256]uint16)(unsafe.Pointer(v.Host))[:]) + "."})
|
||||
nss = append(nss, &NS{ensureEndDot(syscall.UTF16ToString((*[256]uint16)(unsafe.Pointer(v.Host))[:]))})
|
||||
}
|
||||
return nss, nil
|
||||
}
|
||||
|
|
@ -336,7 +344,7 @@ func lookupAddr(addr string) ([]string, error) {
|
|||
ptrs := make([]string, 0, 10)
|
||||
for _, p := range validRecs(r, syscall.DNS_TYPE_PTR, arpa) {
|
||||
v := (*syscall.DNSPTRData)(unsafe.Pointer(&p.Data[0]))
|
||||
ptrs = append(ptrs, syscall.UTF16ToString((*[256]uint16)(unsafe.Pointer(v.Host))[:]))
|
||||
ptrs = append(ptrs, ensureEndDot(syscall.UTF16ToString((*[256]uint16)(unsafe.Pointer(v.Host))[:])))
|
||||
}
|
||||
return ptrs, nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -148,13 +148,6 @@ func (s byHost) Len() int { return len(s) }
|
|||
func (s byHost) Less(i, j int) bool { return s[i].Host < s[j].Host }
|
||||
func (s byHost) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||
|
||||
func fqdn(s string) string {
|
||||
if len(s) == 0 || s[len(s)-1] != '.' {
|
||||
return s + "."
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
func nslookup(qtype, name string) (string, error) {
|
||||
var out bytes.Buffer
|
||||
var err bytes.Buffer
|
||||
|
|
@ -184,14 +177,14 @@ func nslookupMX(name string) (mx []*MX, err error) {
|
|||
rx := regexp.MustCompile(`(?m)^([a-z0-9.\-]+)\s+mail exchanger\s*=\s*([0-9]+)\s*([a-z0-9.\-]+)$`)
|
||||
for _, ans := range rx.FindAllStringSubmatch(r, -1) {
|
||||
pref, _, _ := dtoi(ans[2], 0)
|
||||
mx = append(mx, &MX{fqdn(ans[3]), uint16(pref)})
|
||||
mx = append(mx, &MX{ensureEndDot(ans[3]), uint16(pref)})
|
||||
}
|
||||
// windows nslookup syntax
|
||||
// gmail.com MX preference = 30, mail exchanger = alt3.gmail-smtp-in.l.google.com
|
||||
rx = regexp.MustCompile(`(?m)^([a-z0-9.\-]+)\s+MX preference\s*=\s*([0-9]+)\s*,\s*mail exchanger\s*=\s*([a-z0-9.\-]+)$`)
|
||||
for _, ans := range rx.FindAllStringSubmatch(r, -1) {
|
||||
pref, _, _ := dtoi(ans[2], 0)
|
||||
mx = append(mx, &MX{fqdn(ans[3]), uint16(pref)})
|
||||
mx = append(mx, &MX{ensureEndDot(ans[3]), uint16(pref)})
|
||||
}
|
||||
return
|
||||
}
|
||||
|
|
@ -205,7 +198,7 @@ func nslookupNS(name string) (ns []*NS, err error) {
|
|||
// golang.org nameserver = ns1.google.com.
|
||||
rx := regexp.MustCompile(`(?m)^([a-z0-9.\-]+)\s+nameserver\s*=\s*([a-z0-9.\-]+)$`)
|
||||
for _, ans := range rx.FindAllStringSubmatch(r, -1) {
|
||||
ns = append(ns, &NS{fqdn(ans[2])})
|
||||
ns = append(ns, &NS{ensureEndDot(ans[2])})
|
||||
}
|
||||
return
|
||||
}
|
||||
|
|
@ -222,7 +215,7 @@ func nslookupCNAME(name string) (cname string, err error) {
|
|||
for _, ans := range rx.FindAllStringSubmatch(r, -1) {
|
||||
last = ans[2]
|
||||
}
|
||||
return fqdn(last), nil
|
||||
return ensureEndDot(last), nil
|
||||
}
|
||||
|
||||
func nslookupTXT(name string) (txt []string, err error) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue