17
17
serventLock sync.Mutex
18
18
)
19
19
20
+ var (
21
+ lookupPort = oldLookupPort
22
+ lookupIP = oldLookupIP
23
+ )
24
+
20
25
// lookupProtocol looks up IP protocol name and returns correspondent protocol number.
21
26
func lookupProtocol (name string ) (proto int , err error ) {
22
27
protoentLock .Lock ()
@@ -40,8 +45,6 @@ func lookupHost(name string) (addrs []string, err error) {
40
45
return
41
46
}
42
47
43
- var lookupIP = oldLookupIP
44
-
45
48
func oldLookupIP (name string ) (addrs []IP , err error ) {
46
49
hostentLock .Lock ()
47
50
defer hostentLock .Unlock ()
@@ -92,7 +95,7 @@ func newLookupIP(name string) (addrs []IP, err error) {
92
95
return addrs , nil
93
96
}
94
97
95
- func lookupPort (network , service string ) (port int , err error ) {
98
+ func oldLookupPort (network , service string ) (port int , err error ) {
96
99
switch network {
97
100
case "tcp4" , "tcp6" :
98
101
network = "tcp"
@@ -108,6 +111,40 @@ func lookupPort(network, service string) (port int, err error) {
108
111
return int (syscall .Ntohs (s .Port )), nil
109
112
}
110
113
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
+
111
148
func lookupCNAME (name string ) (cname string , err error ) {
112
149
var r * syscall.DNSRecord
113
150
e := syscall .DnsQuery (name , syscall .DNS_TYPE_CNAME , 0 , nil , & r , nil )
0 commit comments