]> Cypherpunks repositories - gostls13.git/commitdiff
net: implement LookupTXT for windows
authorAlex Brainman <alex.brainman@gmail.com>
Wed, 2 Nov 2011 06:11:40 +0000 (17:11 +1100)
committerAlex Brainman <alex.brainman@gmail.com>
Wed, 2 Nov 2011 06:11:40 +0000 (17:11 +1100)
R=rsc
CC=golang-dev
https://golang.org/cl/5318056

src/pkg/net/lookup_test.go
src/pkg/net/lookup_windows.go
src/pkg/syscall/ztypes_windows.go

index 6b7e53d0c6cbf42242e8d8af419628bce1d1f5b5..9a39ca8a1eb46e4757c4042516c3ad643e1fcf10 100644 (file)
@@ -52,10 +52,6 @@ func TestGmailMX(t *testing.T) {
 }
 
 func TestGmailTXT(t *testing.T) {
-       if runtime.GOOS == "windows" {
-               t.Logf("LookupTXT is not implemented on Windows")
-               return
-       }
        if testing.Short() || avoidMacFirewall {
                t.Logf("skipping test to avoid external network")
                return
index 53cb8f468ad768b85c3cad755bf50b6b6264fbdc..b515d0c851bfaf9a5aba1f3a558df587dabdc305 100644 (file)
@@ -5,7 +5,6 @@
 package net
 
 import (
-       "errors"
        "syscall"
        "unsafe"
        "os"
@@ -81,7 +80,7 @@ func LookupPort(network, service string) (port int, err error) {
 func LookupCNAME(name string) (cname string, err error) {
        var r *syscall.DNSRecord
        e := syscall.DnsQuery(name, syscall.DNS_TYPE_CNAME, 0, nil, &r, nil)
-       if int(e) != 0 {
+       if e != 0 {
                return "", os.NewSyscallError("LookupCNAME", int(e))
        }
        defer syscall.DnsRecordListFree(r, 1)
@@ -110,7 +109,7 @@ func LookupSRV(service, proto, name string) (cname string, addrs []*SRV, err err
        }
        var r *syscall.DNSRecord
        e := syscall.DnsQuery(target, syscall.DNS_TYPE_SRV, 0, nil, &r, nil)
-       if int(e) != 0 {
+       if e != 0 {
                return "", nil, os.NewSyscallError("LookupSRV", int(e))
        }
        defer syscall.DnsRecordListFree(r, 1)
@@ -126,7 +125,7 @@ func LookupSRV(service, proto, name string) (cname string, addrs []*SRV, err err
 func LookupMX(name string) (mx []*MX, err error) {
        var r *syscall.DNSRecord
        e := syscall.DnsQuery(name, syscall.DNS_TYPE_MX, 0, nil, &r, nil)
-       if int(e) != 0 {
+       if e != 0 {
                return nil, os.NewSyscallError("LookupMX", int(e))
        }
        defer syscall.DnsRecordListFree(r, 1)
@@ -140,7 +139,21 @@ func LookupMX(name string) (mx []*MX, err error) {
 }
 
 func LookupTXT(name string) (txt []string, err error) {
-       return nil, errors.New("net.LookupTXT is not implemented on Windows")
+       var r *syscall.DNSRecord
+       e := syscall.DnsQuery(name, syscall.DNS_TYPE_TEXT, 0, nil, &r, nil)
+       if e != 0 {
+               return nil, os.NewSyscallError("LookupTXT", int(e))
+       }
+       defer syscall.DnsRecordListFree(r, 1)
+       txt = make([]string, 0, 10)
+       if r != nil && r.Type == syscall.DNS_TYPE_TEXT {
+               d := (*syscall.DNSTXTData)(unsafe.Pointer(&r.Data[0]))
+               for _, v := range (*[1 << 10]*uint16)(unsafe.Pointer(&(d.StringArray[0])))[:d.StringCount] {
+                       s := syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(v))[:])
+                       txt = append(txt, s)
+               }
+       }
+       return
 }
 
 func LookupAddr(addr string) (name []string, err error) {
@@ -150,7 +163,7 @@ func LookupAddr(addr string) (name []string, err error) {
        }
        var r *syscall.DNSRecord
        e := syscall.DnsQuery(arpa, syscall.DNS_TYPE_PTR, 0, nil, &r, nil)
-       if int(e) != 0 {
+       if e != 0 {
                return nil, os.NewSyscallError("LookupAddr", int(e))
        }
        defer syscall.DnsRecordListFree(r, 1)
index c8db2ee785bb32fbb9647cd7d7acb6335762a5e3..4fe1fa21d4715ace04f893b85a0054ccf2bef30b 100644 (file)
@@ -530,6 +530,11 @@ type DNSMXData struct {
        Pad          uint16
 }
 
+type DNSTXTData struct {
+       StringCount uint16
+       StringArray [1]*uint16
+}
+
 type DNSRecord struct {
        Next     *DNSRecord
        Name     *uint16