package net
import (
"context"
"internal/bytealg"
"sync"
)
var onceReadProtocols sync .Once
func readProtocols() {
file , err := open ("/etc/protocols" )
if err != nil {
return
}
defer file .close ()
for line , ok := file .readLine (); ok ; line , ok = file .readLine () {
if i := bytealg .IndexByteString (line , '#' ); i >= 0 {
line = line [0 :i ]
}
f := getFields (line )
if len (f ) < 2 {
continue
}
if proto , _ , ok := dtoi (f [1 ]); ok {
if _ , ok := protocols [f [0 ]]; !ok {
protocols [f [0 ]] = proto
}
for _ , alias := range f [2 :] {
if _ , ok := protocols [alias ]; !ok {
protocols [alias ] = proto
}
}
}
}
}
func lookupProtocol(_ context .Context , name string ) (int , error ) {
onceReadProtocols .Do (readProtocols )
return lookupProtocolMap (name )
}
func (r *Resolver ) lookupHost (ctx context .Context , host string ) (addrs []string , err error ) {
order , conf := systemConf ().hostLookupOrder (r , host )
if order == hostLookupCgo {
return cgoLookupHost (ctx , host )
}
return r .goLookupHostOrder (ctx , host , order , conf )
}
func (r *Resolver ) lookupIP (ctx context .Context , network , host string ) (addrs []IPAddr , err error ) {
order , conf := systemConf ().hostLookupOrder (r , host )
if order == hostLookupCgo {
return cgoLookupIP (ctx , network , host )
}
ips , _ , err := r .goLookupIPCNAMEOrder (ctx , network , host , order , conf )
return ips , err
}
func (r *Resolver ) lookupPort (ctx context .Context , network , service string ) (int , error ) {
if !systemConf ().mustUseGoResolver (r ) {
port , err := cgoLookupPort (ctx , network , service )
if err != nil {
if port , err := goLookupPort (network , service ); err == nil {
return port , nil
}
}
return port , err
}
return goLookupPort (network , service )
}
func (r *Resolver ) lookupCNAME (ctx context .Context , name string ) (string , error ) {
order , conf := systemConf ().hostLookupOrder (r , name )
if order == hostLookupCgo {
if cname , err , ok := cgoLookupCNAME (ctx , name ); ok {
return cname , err
}
}
return r .goLookupCNAME (ctx , name , order , conf )
}
func (r *Resolver ) lookupSRV (ctx context .Context , service , proto , name string ) (string , []*SRV , error ) {
return r .goLookupSRV (ctx , service , proto , name )
}
func (r *Resolver ) lookupMX (ctx context .Context , name string ) ([]*MX , error ) {
return r .goLookupMX (ctx , name )
}
func (r *Resolver ) lookupNS (ctx context .Context , name string ) ([]*NS , error ) {
return r .goLookupNS (ctx , name )
}
func (r *Resolver ) lookupTXT (ctx context .Context , name string ) ([]string , error ) {
return r .goLookupTXT (ctx , name )
}
func (r *Resolver ) lookupAddr (ctx context .Context , addr string ) ([]string , error ) {
order , conf := systemConf ().addrLookupOrder (r , addr )
if order == hostLookupCgo {
return cgoLookupPTR (ctx , addr )
}
return r .goLookupPTR (ctx , addr , order , conf )
}
The pages are generated with Golds v0.7.3-preview . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .