]> Cypherpunks repositories - gostls13.git/commitdiff
net: allow LookupSRV on non-standard DNS names
authorRuss Cox <rsc@golang.org>
Tue, 18 Oct 2011 17:57:04 +0000 (13:57 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 18 Oct 2011 17:57:04 +0000 (13:57 -0400)
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5313043

src/pkg/net/lookup_plan9.go
src/pkg/net/lookup_test.go
src/pkg/net/lookup_unix.go
src/pkg/net/lookup_windows.go

index ee0c9e879eccd56d66efc404b2d030215f1a702d..d779f4a5d71880f6fa15062b11fa9df240ae492a 100644 (file)
@@ -157,12 +157,21 @@ func LookupCNAME(name string) (cname string, err os.Error) {
 }
 
 // LookupSRV tries to resolve an SRV query of the given service,
-// protocol, and domain name, as specified in RFC 2782. In most cases
-// the proto argument can be the same as the corresponding
-// Addr.Network(). The returned records are sorted by priority 
-// and randomized by weight within a priority.
+// 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) {
-       target := "_" + service + "._" + proto + "." + name
+       var target string
+       if service == "" && proto == "" {
+               target = name
+       } else {
+               target = "_" + service + "._" + proto + "." + name
+       }
        lines, err := queryDNS(target, "srv")
        if err != nil {
                return
index 41066fe48091b4ad56b23f003551bfde199f9b0b..c0fcd260472df948b5faa77a739e250a33bdafcd 100644 (file)
@@ -26,6 +26,15 @@ func TestGoogleSRV(t *testing.T) {
        if len(addrs) == 0 {
                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) {
index 387bb5976c9e08a9a39a25d4c777c92ecd74b443..6e79295a9488f79129bb5325601792adcf304ee3 100644 (file)
@@ -94,12 +94,21 @@ func LookupCNAME(name string) (cname string, err os.Error) {
 }
 
 // LookupSRV tries to resolve an SRV query of the given service,
-// protocol, and domain name, as specified in RFC 2782. In most cases
-// the proto argument can be the same as the corresponding
-// Addr.Network(). The returned records are sorted by priority
-// and randomized by weight within a priority.
+// 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) {
-       target := "_" + service + "._" + proto + "." + name
+       var target string
+       if service == "" && proto == "" {
+               target = name
+       } else {
+               target = "_" + service + "._" + proto + "." + name
+       }
        var records []dnsRR
        cname, records, err = lookup(target, dnsTypeSRV)
        if err != nil {
index e138698241c8ac0b77d1d4f3baf3edc171311037..ea939f859861c8b4922f6b8a9b962cd2f486af19 100644 (file)
@@ -91,9 +91,23 @@ func LookupCNAME(name string) (cname string, err os.Error) {
        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) {
+       var target string
+       if service == "" && proto == "" {
+               target = name
+       } else {
+               target = "_" + service + "._" + proto + "." + name
+       }
        var r *syscall.DNSRecord
-       target := "_" + service + "._" + proto + "." + name
        e := syscall.DnsQuery(target, syscall.DNS_TYPE_SRV, 0, nil, &r, nil)
        if int(e) != 0 {
                return "", nil, os.NewSyscallError("LookupSRV", int(e))