Skip to content

Commit 6d175e2

Browse files
committed
net: use windows GetAddrInfoW in LookupPort when possible
R=golang-dev, bradfitz CC=golang-dev https://golang.org/cl/7252045
1 parent 44cf814 commit 6d175e2

File tree

3 files changed

+42
-4
lines changed

3 files changed

+42
-4
lines changed

src/pkg/net/fd_windows.go

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ func sysInit() {
3737
}
3838
canCancelIO = syscall.LoadCancelIoEx() == nil
3939
if syscall.LoadGetAddrInfo() == nil {
40+
lookupPort = newLookupPort
4041
lookupIP = newLookupIP
4142
}
4243
}

src/pkg/net/lookup_windows.go

+40-3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ var (
1717
serventLock sync.Mutex
1818
)
1919

20+
var (
21+
lookupPort = oldLookupPort
22+
lookupIP = oldLookupIP
23+
)
24+
2025
// lookupProtocol looks up IP protocol name and returns correspondent protocol number.
2126
func lookupProtocol(name string) (proto int, err error) {
2227
protoentLock.Lock()
@@ -40,8 +45,6 @@ func lookupHost(name string) (addrs []string, err error) {
4045
return
4146
}
4247

43-
var lookupIP = oldLookupIP
44-
4548
func oldLookupIP(name string) (addrs []IP, err error) {
4649
hostentLock.Lock()
4750
defer hostentLock.Unlock()
@@ -92,7 +95,7 @@ func newLookupIP(name string) (addrs []IP, err error) {
9295
return addrs, nil
9396
}
9497

95-
func lookupPort(network, service string) (port int, err error) {
98+
func oldLookupPort(network, service string) (port int, err error) {
9699
switch network {
97100
case "tcp4", "tcp6":
98101
network = "tcp"
@@ -108,6 +111,40 @@ func lookupPort(network, service string) (port int, err error) {
108111
return int(syscall.Ntohs(s.Port)), nil
109112
}
110113

114+
func newLookupPort(network, service string) (port int, err error) {
115+
var stype int32
116+
switch network {
117+
case "tcp4", "tcp6":
118+
stype = syscall.SOCK_STREAM
119+
case "udp4", "udp6":
120+
stype = syscall.SOCK_DGRAM
121+
}
122+
hints := syscall.AddrinfoW{
123+
Family: syscall.AF_UNSPEC,
124+
Socktype: stype,
125+
Protocol: syscall.IPPROTO_IP,
126+
}
127+
var result *syscall.AddrinfoW
128+
e := syscall.GetAddrInfoW(nil, syscall.StringToUTF16Ptr(service), &hints, &result)
129+
if e != nil {
130+
return 0, os.NewSyscallError("GetAddrInfoW", e)
131+
}
132+
defer syscall.FreeAddrInfoW(result)
133+
if result == nil {
134+
return 0, os.NewSyscallError("LookupPort", syscall.EINVAL)
135+
}
136+
addr := unsafe.Pointer(result.Addr)
137+
switch result.Family {
138+
case syscall.AF_INET:
139+
a := (*syscall.RawSockaddrInet4)(addr)
140+
return int(syscall.Ntohs(a.Port)), nil
141+
case syscall.AF_INET6:
142+
a := (*syscall.RawSockaddrInet6)(addr)
143+
return int(syscall.Ntohs(a.Port)), nil
144+
}
145+
return 0, os.NewSyscallError("LookupPort", syscall.EINVAL)
146+
}
147+
111148
func lookupCNAME(name string) (cname string, err error) {
112149
var r *syscall.DNSRecord
113150
e := syscall.DnsQuery(name, syscall.DNS_TYPE_CNAME, 0, nil, &r, nil)

src/pkg/net/port_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func TestLookupPort(t *testing.T) {
4646
for i := 0; i < len(porttests); i++ {
4747
tt := porttests[i]
4848
if port, err := LookupPort(tt.netw, tt.name); port != tt.port || (err == nil) != tt.ok {
49-
t.Errorf("LookupPort(%q, %q) = %v, %s; want %v",
49+
t.Errorf("LookupPort(%q, %q) = %v, %v; want %v",
5050
tt.netw, tt.name, port, err, tt.port)
5151
}
5252
}

0 commit comments

Comments
 (0)