15
protoentLock sync.Mutex
16
hostentLock sync.Mutex
17
serventLock sync.Mutex
15
lookupPort = oldLookupPort
16
lookupIP = oldLookupIP
20
// lookupProtocol looks up IP protocol name and returns correspondent protocol number.
21
func lookupProtocol(name string) (proto int, err error) {
23
defer protoentLock.Unlock()
19
func getprotobyname(name string) (proto int, err error) {
24
20
p, err := syscall.GetProtoByName(name)
26
22
return 0, os.NewSyscallError("GetProtoByName", err)
28
24
return int(p.Proto), nil
27
// lookupProtocol looks up IP protocol name and returns correspondent protocol number.
28
func lookupProtocol(name string) (proto int, err error) {
29
// GetProtoByName return value is stored in thread local storage.
30
// Start new os thread before the call to prevent races.
35
ch := make(chan result)
37
runtime.LockOSThread()
38
defer runtime.UnlockOSThread()
39
proto, err := getprotobyname(name)
40
ch <- result{proto: proto, err: err}
31
46
func lookupHost(name string) (addrs []string, err error) {
32
47
ips, err := LookupIP(name)
43
func lookupIP(name string) (addrs []IP, err error) {
45
defer hostentLock.Unlock()
58
func gethostbyname(name string) (addrs []IP, err error) {
46
59
h, err := syscall.GetHostByName(name)
48
61
return nil, os.NewSyscallError("GetHostByName", err)
58
71
default: // TODO(vcc): Implement non IPv4 address lookups.
59
return nil, os.NewSyscallError("LookupHost", syscall.EWINDOWS)
64
func lookupPort(network, service string) (port int, err error) {
72
return nil, os.NewSyscallError("LookupIP", syscall.EWINDOWS)
77
func oldLookupIP(name string) (addrs []IP, err error) {
78
// GetHostByName return value is stored in thread local storage.
79
// Start new os thread before the call to prevent races.
84
ch := make(chan result)
86
runtime.LockOSThread()
87
defer runtime.UnlockOSThread()
88
addrs, err := gethostbyname(name)
89
ch <- result{addrs: addrs, err: err}
95
func newLookupIP(name string) (addrs []IP, err error) {
96
hints := syscall.AddrinfoW{
97
Family: syscall.AF_UNSPEC,
98
Socktype: syscall.SOCK_STREAM,
99
Protocol: syscall.IPPROTO_IP,
101
var result *syscall.AddrinfoW
102
e := syscall.GetAddrInfoW(syscall.StringToUTF16Ptr(name), nil, &hints, &result)
104
return nil, os.NewSyscallError("GetAddrInfoW", e)
106
defer syscall.FreeAddrInfoW(result)
107
addrs = make([]IP, 0, 5)
108
for ; result != nil; result = result.Next {
109
addr := unsafe.Pointer(result.Addr)
110
switch result.Family {
111
case syscall.AF_INET:
112
a := (*syscall.RawSockaddrInet4)(addr).Addr
113
addrs = append(addrs, IPv4(a[0], a[1], a[2], a[3]))
114
case syscall.AF_INET6:
115
a := (*syscall.RawSockaddrInet6)(addr).Addr
116
addrs = append(addrs, IP{a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]})
118
return nil, os.NewSyscallError("LookupIP", syscall.EWINDOWS)
124
func getservbyname(network, service string) (port int, err error) {
66
126
case "tcp4", "tcp6":
68
128
case "udp4", "udp6":
72
defer serventLock.Unlock()
73
131
s, err := syscall.GetServByName(service, network)
75
133
return 0, os.NewSyscallError("GetServByName", err)
77
135
return int(syscall.Ntohs(s.Port)), nil
138
func oldLookupPort(network, service string) (port int, err error) {
139
// GetServByName return value is stored in thread local storage.
140
// Start new os thread before the call to prevent races.
145
ch := make(chan result)
147
runtime.LockOSThread()
148
defer runtime.UnlockOSThread()
149
port, err := getservbyname(network, service)
150
ch <- result{port: port, err: err}
156
func newLookupPort(network, service string) (port int, err error) {
160
stype = syscall.SOCK_STREAM
162
stype = syscall.SOCK_DGRAM
164
hints := syscall.AddrinfoW{
165
Family: syscall.AF_UNSPEC,
167
Protocol: syscall.IPPROTO_IP,
169
var result *syscall.AddrinfoW
170
e := syscall.GetAddrInfoW(nil, syscall.StringToUTF16Ptr(service), &hints, &result)
172
return 0, os.NewSyscallError("GetAddrInfoW", e)
174
defer syscall.FreeAddrInfoW(result)
176
return 0, os.NewSyscallError("LookupPort", syscall.EINVAL)
178
addr := unsafe.Pointer(result.Addr)
179
switch result.Family {
180
case syscall.AF_INET:
181
a := (*syscall.RawSockaddrInet4)(addr)
182
return int(syscall.Ntohs(a.Port)), nil
183
case syscall.AF_INET6:
184
a := (*syscall.RawSockaddrInet6)(addr)
185
return int(syscall.Ntohs(a.Port)), nil
187
return 0, os.NewSyscallError("LookupPort", syscall.EINVAL)
80
190
func lookupCNAME(name string) (cname string, err error) {
81
191
var r *syscall.DNSRecord
82
192
e := syscall.DnsQuery(name, syscall.DNS_TYPE_CNAME, 0, nil, &r, nil)
242
func lookupNS(name string) (ns []*NS, err error) {
243
var r *syscall.DNSRecord
244
e := syscall.DnsQuery(name, syscall.DNS_TYPE_NS, 0, nil, &r, nil)
246
return nil, os.NewSyscallError("LookupNS", e)
248
defer syscall.DnsRecordListFree(r, 1)
249
ns = make([]*NS, 0, 10)
250
for p := r; p != nil && p.Type == syscall.DNS_TYPE_NS; p = p.Next {
251
v := (*syscall.DNSPTRData)(unsafe.Pointer(&p.Data[0]))
252
ns = append(ns, &NS{syscall.UTF16ToString((*[256]uint16)(unsafe.Pointer(v.Host))[:]) + "."})
132
257
func lookupTXT(name string) (txt []string, err error) {
133
258
var r *syscall.DNSRecord
134
259
e := syscall.DnsQuery(name, syscall.DNS_TYPE_TEXT, 0, nil, &r, nil)