1 // Copyright 2011 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
14 var onceReadProtocols sync
.Once
16 // readProtocols loads contents of /etc/protocols into protocols map
18 func readProtocols() {
19 if file
, err
:= open("/etc/protocols"); err
== nil {
20 for line
, ok
:= file
.readLine(); ok
; line
, ok
= file
.readLine() {
21 // tcp 6 TCP # transmission control protocol
22 if i
:= byteIndex(line
, '#'); i
>= 0 {
29 if proto
, _
, ok
:= dtoi(f
[1], 0); ok
{
30 if _
, ok
:= protocols
[f
[0]]; !ok
{
31 protocols
[f
[0]] = proto
33 for _
, alias
:= range f
[2:] {
34 if _
, ok
:= protocols
[alias
]; !ok
{
35 protocols
[alias
] = proto
44 // lookupProtocol looks up IP protocol name in /etc/protocols and
45 // returns correspondent protocol number.
46 func lookupProtocol(name
string) (proto
int, err error
) {
47 onceReadProtocols
.Do(readProtocols
)
48 proto
, found
:= protocols
[name
]
50 return 0, errors
.New("unknown IP protocol specified: " + name
)
55 func lookupHost(host
string) (addrs
[]string, err error
) {
56 addrs
, err
, ok
:= cgoLookupHost(host
)
58 addrs
, err
= goLookupHost(host
)
63 func lookupIP(host
string) (addrs
[]IP
, err error
) {
64 addrs
, err
, ok
:= cgoLookupIP(host
)
66 addrs
, err
= goLookupIP(host
)
71 func lookupPort(network
, service
string) (port
int, err error
) {
72 port
, err
, ok
:= cgoLookupPort(network
, service
)
74 port
, err
= goLookupPort(network
, service
)
79 func lookupCNAME(name
string) (cname
string, err error
) {
80 cname
, err
, ok
:= cgoLookupCNAME(name
)
82 cname
, err
= goLookupCNAME(name
)
87 func lookupSRV(service
, proto
, name
string) (cname
string, addrs
[]*SRV
, err error
) {
89 if service
== "" && proto
== "" {
92 target
= "_" + service
+ "._" + proto
+ "." + name
95 cname
, records
, err
= lookup(target
, dnsTypeSRV
)
99 addrs
= make([]*SRV
, len(records
))
100 for i
, rr
:= range records
{
102 addrs
[i
] = &SRV
{r
.Target
, r
.Port
, r
.Priority
, r
.Weight
}
104 byPriorityWeight(addrs
).sort()
108 func lookupMX(name
string) (mx
[]*MX
, err error
) {
109 _
, records
, err
:= lookup(name
, dnsTypeMX
)
113 mx
= make([]*MX
, len(records
))
114 for i
, rr
:= range records
{
116 mx
[i
] = &MX
{r
.Mx
, r
.Pref
}
122 func lookupNS(name
string) (ns
[]*NS
, err error
) {
123 _
, records
, err
:= lookup(name
, dnsTypeNS
)
127 ns
= make([]*NS
, len(records
))
128 for i
, r
:= range records
{
135 func lookupTXT(name
string) (txt
[]string, err error
) {
136 _
, records
, err
:= lookup(name
, dnsTypeTXT
)
140 txt
= make([]string, len(records
))
141 for i
, r
:= range records
{
142 txt
[i
] = r
.(*dnsRR_TXT
).Txt
147 func lookupAddr(addr
string) (name
[]string, err error
) {
148 name
= lookupStaticAddr(addr
)
153 arpa
, err
= reverseaddr(addr
)
158 _
, records
, err
= lookup(arpa
, dnsTypePTR
)
162 name
= make([]string, len(records
))
163 for i
:= range records
{
164 r
:= records
[i
].(*dnsRR_PTR
)