package net
import (
)
func ( syscall.Sockaddr) Addr {
switch sa := .(type) {
case *syscall.SockaddrInet4:
return &TCPAddr{IP: .Addr[0:], Port: .Port}
case *syscall.SockaddrInet6:
return &TCPAddr{IP: .Addr[0:], Port: .Port, Zone: zoneCache.name(int(.ZoneId))}
}
return nil
}
func ( *TCPAddr) () int {
if == nil || len(.IP) <= IPv4len {
return syscall.AF_INET
}
if .IP.To4() != nil {
return syscall.AF_INET
}
return syscall.AF_INET6
}
func ( *TCPAddr) ( int) (syscall.Sockaddr, error) {
if == nil {
return nil, nil
}
return ipToSockaddr(, .IP, .Port, .Zone)
}
func ( *TCPAddr) ( string) sockaddr {
return &TCPAddr{loopbackIP(), .Port, .Zone}
}
func ( *TCPConn) ( io.Reader) (int64, error) {
if , , := spliceFrom(.fd, ); {
return ,
}
if , , := sendFile(.fd, ); {
return ,
}
return genericReadFrom(, )
}
func ( *TCPConn) ( io.Writer) (int64, error) {
if , , := spliceTo(, .fd); {
return ,
}
return genericWriteTo(, )
}
func ( *sysDialer) ( context.Context, , *TCPAddr) (*TCPConn, error) {
if := .testHookDialTCP; != nil {
return (, .network, , )
}
if := testHookDialTCP; != nil {
return (, .network, , )
}
return .doDialTCP(, , )
}
func ( *sysDialer) ( context.Context, , *TCPAddr) (*TCPConn, error) {
return .doDialTCPProto(, , , 0)
}
func ( *sysDialer) ( context.Context, , *TCPAddr, int) (*TCPConn, error) {
:= .Dialer.ControlContext
if == nil && .Dialer.Control != nil {
= func( context.Context, , string, syscall.RawConn) error {
return .Dialer.Control(, , )
}
}
, := internetSocket(, .network, , , syscall.SOCK_STREAM, , "dial", )
for := 0; < 2 && ( == nil || .Port == 0) && (selfConnect(, ) || spuriousENOTAVAIL()); ++ {
if == nil {
.Close()
}
, = internetSocket(, .network, , , syscall.SOCK_STREAM, , "dial", )
}
if != nil {
return nil,
}
return newTCPConn(, .Dialer.KeepAlive, .Dialer.KeepAliveConfig, testPreHookSetKeepAlive, testHookSetKeepAlive), nil
}
func ( *netFD, error) bool {
if != nil {
return false
}
if .laddr == nil || .raddr == nil {
return true
}
:= .laddr.(*TCPAddr)
:= .raddr.(*TCPAddr)
return .Port == .Port && .IP.Equal(.IP)
}
func ( error) bool {
if , := .(*OpError); {
= .Err
}
if , := .(*os.SyscallError); {
= .Err
}
return == syscall.EADDRNOTAVAIL
}
func ( *TCPListener) () bool { return != nil && .fd != nil }
func ( *TCPListener) () (*TCPConn, error) {
, := .fd.accept()
if != nil {
return nil,
}
return newTCPConn(, .lc.KeepAlive, .lc.KeepAliveConfig, testPreHookSetKeepAlive, testHookSetKeepAlive), nil
}
func ( *TCPListener) () error {
return .fd.Close()
}
func ( *TCPListener) () (*os.File, error) {
, := .fd.dup()
if != nil {
return nil,
}
return , nil
}
func ( *sysListener) ( context.Context, *TCPAddr) (*TCPListener, error) {
return .listenTCPProto(, , 0)
}
func ( *sysListener) ( context.Context, *TCPAddr, int) (*TCPListener, error) {
var func( context.Context, , string, syscall.RawConn) error
if .ListenConfig.Control != nil {
= func( context.Context, , string, syscall.RawConn) error {
return .ListenConfig.Control(, , )
}
}
, := internetSocket(, .network, , nil, syscall.SOCK_STREAM, , "listen", )
if != nil {
return nil,
}
return &TCPListener{fd: , lc: .ListenConfig}, nil
}