package net
import _
import (
)
type addrinfoErrno int
func ( addrinfoErrno) () string { return ( _Cfunc_GoString )(( _Cfunc_gai_strerror )( _Ctype_int ())) }
func ( addrinfoErrno) () bool { return == ( _Ciconst_EAI_AGAIN ) }
func ( addrinfoErrno) () bool { return false }
type portLookupResult struct {
port int
err error
}
type ipLookupResult struct {
addrs []IPAddr
cname string
err error
}
type reverseLookupResult struct {
names []string
err error
}
func ( context.Context, string) ( []string, error, bool) {
, , := cgoLookupIP(, "ip", )
for , := range {
= append(, .String())
}
return
}
func ( context.Context, , string) ( int, error, bool) {
var _Ctype_struct_addrinfo
switch {
case "":
case "tcp", "tcp4", "tcp6":
.ai_socktype = ( _Ciconst_SOCK_STREAM )
.ai_protocol = ( _Ciconst_IPPROTO_TCP )
case "udp", "udp4", "udp6":
.ai_socktype = ( _Ciconst_SOCK_DGRAM )
.ai_protocol = ( _Ciconst_IPPROTO_UDP )
default:
return 0, &DNSError{Err: "unknown network", Name: + "/" + }, true
}
switch ipVersion() {
case '4':
.ai_family = ( _Ciconst_AF_INET )
case '6':
.ai_family = ( _Ciconst_AF_INET6 )
}
if .Done() == nil {
, := cgoLookupServicePort(&, , )
return , , true
}
:= make(chan portLookupResult, 1)
go cgoPortLookup(, &, , )
select {
case := <-:
return .port, .err, true
case <-.Done():
return 0, mapErr(.Err()), false
}
}
func ( * _Ctype_struct_addrinfo , , string) ( int, error) {
:= make([]byte, len()+1)
copy(, )
for , := range [:len()] {
[] = lowerASCII()
}
var * _Ctype_struct_addrinfo
, := func() (_Ctype_int, error){ var *_Ctype_char = nil; var *_Ctype_char = (*_Ctype_char)(unsafe.Pointer(&[0])); := ; := &; := ; _cgoCheckPointer(, nil); _cgoCheckPointer(, 0 == 0); return _C2func_getaddrinfo(, , , ); }()
if != 0 {
:= false
switch {
case ( _Ciconst_EAI_SYSTEM ):
if == nil {
= syscall.EMFILE
}
default:
= addrinfoErrno()
= addrinfoErrno().Temporary()
}
return 0, &DNSError{Err: .Error(), Name: + "/" + , IsTemporary: }
}
defer func() func() { := ; return func() { _cgoCheckPointer(, nil); _Cfunc_freeaddrinfo(); }}()()
for := ; != nil; = .ai_next {
switch .ai_family {
case ( _Ciconst_AF_INET ):
:= (*syscall.RawSockaddrInet4)(unsafe.Pointer(.ai_addr))
:= (*[2]byte)(unsafe.Pointer(&.Port))
return int([0])<<8 | int([1]), nil
case ( _Ciconst_AF_INET6 ):
:= (*syscall.RawSockaddrInet6)(unsafe.Pointer(.ai_addr))
:= (*[2]byte)(unsafe.Pointer(&.Port))
return int([0])<<8 | int([1]), nil
}
}
return 0, &DNSError{Err: "unknown port", Name: + "/" + }
}
func ( chan<- portLookupResult, * _Ctype_struct_addrinfo , , string) {
, := cgoLookupServicePort(, , )
<- portLookupResult{, }
}
func (, string) ( []IPAddr, string, error) {
acquireThread()
defer releaseThread()
var _Ctype_struct_addrinfo
.ai_flags = cgoAddrInfoFlags
.ai_socktype = ( _Ciconst_SOCK_STREAM )
.ai_family = ( _Ciconst_AF_UNSPEC )
switch ipVersion() {
case '4':
.ai_family = ( _Ciconst_AF_INET )
case '6':
.ai_family = ( _Ciconst_AF_INET6 )
}
:= make([]byte, len()+1)
copy(, )
var * _Ctype_struct_addrinfo
, := func() (_Ctype_int, error){ var *_Ctype_char = (*_Ctype_char)(unsafe.Pointer(&[0])); var *_Ctype_char = nil; := &; := ; := &; := ; _cgoCheckPointer(, 0 == 0); _cgoCheckPointer(, 0 == 0); return _C2func_getaddrinfo(, , , ); }()
if != 0 {
:= false
:= false
switch {
case ( _Ciconst_EAI_SYSTEM ):
if == nil {
= syscall.EMFILE
}
case ( _Ciconst_EAI_NONAME ):
= errNoSuchHost
= true
default:
= addrinfoErrno()
= addrinfoErrno().Temporary()
}
return nil, "", &DNSError{Err: .Error(), Name: , IsNotFound: , IsTemporary: }
}
defer func() func() { := ; return func() { _cgoCheckPointer(, nil); _Cfunc_freeaddrinfo(); }}()()
if != nil {
= ( _Cfunc_GoString )(.ai_canonname)
if == "" {
=
}
if len() > 0 && [len()-1] != '.' {
+= "."
}
}
for := ; != nil; = .ai_next {
if .ai_socktype != ( _Ciconst_SOCK_STREAM ) {
continue
}
switch .ai_family {
case ( _Ciconst_AF_INET ):
:= (*syscall.RawSockaddrInet4)(unsafe.Pointer(.ai_addr))
:= IPAddr{IP: copyIP(.Addr[:])}
= append(, )
case ( _Ciconst_AF_INET6 ):
:= (*syscall.RawSockaddrInet6)(unsafe.Pointer(.ai_addr))
:= IPAddr{IP: copyIP(.Addr[:]), Zone: zoneCache.name(int(.Scope_id))}
= append(, )
}
}
return , , nil
}
func ( chan<- ipLookupResult, , string) {
, , := cgoLookupIPCNAME(, )
<- ipLookupResult{, , }
}
func ( context.Context, , string) ( []IPAddr, error, bool) {
if .Done() == nil {
, _, = cgoLookupIPCNAME(, )
return , , true
}
:= make(chan ipLookupResult, 1)
go cgoIPLookup(, , )
select {
case := <-:
return .addrs, .err, true
case <-.Done():
return nil, mapErr(.Err()), false
}
}
func ( context.Context, string) ( string, error, bool) {
if .Done() == nil {
_, , = cgoLookupIPCNAME("ip", )
return , , true
}
:= make(chan ipLookupResult, 1)
go cgoIPLookup(, "ip", )
select {
case := <-:
return .cname, .err, true
case <-.Done():
return "", mapErr(.Err()), false
}
}
const (
nameinfoLen = 64
maxNameinfoLen = 4096
)
func ( context.Context, string) ( []string, error, bool) {
var string
:= parseIPv4()
if == nil {
, = parseIPv6Zone()
}
if == nil {
return nil, &DNSError{Err: "invalid address", Name: }, true
}
, := cgoSockaddr(, )
if == nil {
return nil, &DNSError{Err: "invalid address " + .String(), Name: }, true
}
if .Done() == nil {
, := cgoLookupAddrPTR(, , )
return , , true
}
:= make(chan reverseLookupResult, 1)
go cgoReverseLookup(, , , )
select {
case := <-:
return .names, .err, true
case <-.Done():
return nil, mapErr(.Err()), false
}
}
func ( string, * _Ctype_struct_sockaddr , _Ctype_socklen_t ) ( []string, error) {
acquireThread()
defer releaseThread()
var int
var []byte
for := nameinfoLen; <= maxNameinfoLen; *= 2 {
= make([]byte, )
, = cgoNameinfoPTR(, , )
if == 0 || != ( _Ciconst_EAI_OVERFLOW ) {
break
}
}
if != 0 {
:= false
switch {
case ( _Ciconst_EAI_SYSTEM ):
if == nil {
= syscall.EMFILE
}
default:
= addrinfoErrno()
= addrinfoErrno().Temporary()
}
return nil, &DNSError{Err: .Error(), Name: , IsTemporary: }
}
for := 0; < len(); ++ {
if [] == 0 {
= [:]
break
}
}
return []string{absDomainName()}, nil
}
func ( chan<- reverseLookupResult, string, * _Ctype_struct_sockaddr , _Ctype_socklen_t ) {
, := cgoLookupAddrPTR(, , )
<- reverseLookupResult{, }
}
func ( IP, string) (* _Ctype_struct_sockaddr , _Ctype_socklen_t ) {
if := .To4(); != nil {
return cgoSockaddrInet4(), _Ctype_socklen_t (syscall.SizeofSockaddrInet4)
}
if := .To16(); != nil {
return cgoSockaddrInet6(, zoneCache.index()), _Ctype_socklen_t (syscall.SizeofSockaddrInet6)
}
return nil, 0
}
func ( IP) IP {
if len() < 16 {
return .To16()
}
:= make(IP, len())
copy(, )
return
}