Commit 48bb3e8f authored by Russ Cox's avatar Russ Cox

net: allow LookupSRV on non-standard DNS names

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5313043
parent 835dcb71
...@@ -157,12 +157,21 @@ func LookupCNAME(name string) (cname string, err os.Error) { ...@@ -157,12 +157,21 @@ func LookupCNAME(name string) (cname string, err os.Error) {
} }
// LookupSRV tries to resolve an SRV query of the given service, // LookupSRV tries to resolve an SRV query of the given service,
// protocol, and domain name, as specified in RFC 2782. In most cases // protocol, and domain name. The proto is "tcp" or "udp".
// the proto argument can be the same as the corresponding // The returned records are sorted by priority and randomized
// Addr.Network(). The returned records are sorted by priority // by weight within a priority.
// and randomized by weight within a priority. //
// LookupSRV constructs the DNS name to look up following RFC 2782.
// That is, it looks up _service._proto.name. To accommodate services
// publishing SRV records under non-standard names, if both service
// and proto are empty strings, LookupSRV looks up name directly.
func LookupSRV(service, proto, name string) (cname string, addrs []*SRV, err os.Error) { func LookupSRV(service, proto, name string) (cname string, addrs []*SRV, err os.Error) {
target := "_" + service + "._" + proto + "." + name var target string
if service == "" && proto == "" {
target = name
} else {
target = "_" + service + "._" + proto + "." + name
}
lines, err := queryDNS(target, "srv") lines, err := queryDNS(target, "srv")
if err != nil { if err != nil {
return return
......
...@@ -26,6 +26,15 @@ func TestGoogleSRV(t *testing.T) { ...@@ -26,6 +26,15 @@ func TestGoogleSRV(t *testing.T) {
if len(addrs) == 0 { if len(addrs) == 0 {
t.Errorf("no results") t.Errorf("no results")
} }
// Non-standard back door.
_, addrs, err = LookupSRV("", "", "_xmpp-server._tcp.google.com")
if err != nil {
t.Errorf("back door failed: %s", err)
}
if len(addrs) == 0 {
t.Errorf("back door no results")
}
} }
func TestGmailMX(t *testing.T) { func TestGmailMX(t *testing.T) {
......
...@@ -94,12 +94,21 @@ func LookupCNAME(name string) (cname string, err os.Error) { ...@@ -94,12 +94,21 @@ func LookupCNAME(name string) (cname string, err os.Error) {
} }
// LookupSRV tries to resolve an SRV query of the given service, // LookupSRV tries to resolve an SRV query of the given service,
// protocol, and domain name, as specified in RFC 2782. In most cases // protocol, and domain name. The proto is "tcp" or "udp".
// the proto argument can be the same as the corresponding // The returned records are sorted by priority and randomized
// Addr.Network(). The returned records are sorted by priority // by weight within a priority.
// and randomized by weight within a priority. //
// LookupSRV constructs the DNS name to look up following RFC 2782.
// That is, it looks up _service._proto.name. To accommodate services
// publishing SRV records under non-standard names, if both service
// and proto are empty strings, LookupSRV looks up name directly.
func LookupSRV(service, proto, name string) (cname string, addrs []*SRV, err os.Error) { func LookupSRV(service, proto, name string) (cname string, addrs []*SRV, err os.Error) {
target := "_" + service + "._" + proto + "." + name var target string
if service == "" && proto == "" {
target = name
} else {
target = "_" + service + "._" + proto + "." + name
}
var records []dnsRR var records []dnsRR
cname, records, err = lookup(target, dnsTypeSRV) cname, records, err = lookup(target, dnsTypeSRV)
if err != nil { if err != nil {
......
...@@ -91,9 +91,23 @@ func LookupCNAME(name string) (cname string, err os.Error) { ...@@ -91,9 +91,23 @@ func LookupCNAME(name string) (cname string, err os.Error) {
return return
} }
// LookupSRV tries to resolve an SRV query of the given service,
// protocol, and domain name. The proto is "tcp" or "udp".
// The returned records are sorted by priority and randomized
// by weight within a priority.
//
// LookupSRV constructs the DNS name to look up following RFC 2782.
// That is, it looks up _service._proto.name. To accommodate services
// publishing SRV records under non-standard names, if both service
// and proto are empty strings, LookupSRV looks up name directly.
func LookupSRV(service, proto, name string) (cname string, addrs []*SRV, err os.Error) { func LookupSRV(service, proto, name string) (cname string, addrs []*SRV, err os.Error) {
var target string
if service == "" && proto == "" {
target = name
} else {
target = "_" + service + "._" + proto + "." + name
}
var r *syscall.DNSRecord var r *syscall.DNSRecord
target := "_" + service + "._" + proto + "." + name
e := syscall.DnsQuery(target, syscall.DNS_TYPE_SRV, 0, nil, &r, nil) e := syscall.DnsQuery(target, syscall.DNS_TYPE_SRV, 0, nil, &r, nil)
if int(e) != 0 { if int(e) != 0 {
return "", nil, os.NewSyscallError("LookupSRV", int(e)) return "", nil, os.NewSyscallError("LookupSRV", int(e))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment