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 , , := splice(.fd, ); {
return ,
}
if , , := sendFile(.fd, ); {
return ,
}
return genericReadFrom(, )
}
func ( *sysDialer) ( context.Context, , *TCPAddr) (*TCPConn, error) {
if testHookDialTCP != nil {
return testHookDialTCP(, .network, , )
}
return .doDialTCP(, , )
}
func ( *sysDialer) ( context.Context, , *TCPAddr) (*TCPConn, error) {
, := internetSocket(, .network, , , syscall.SOCK_STREAM, 0, "dial", .Dialer.Control)
for := 0; < 2 && ( == nil || .Port == 0) && (selfConnect(, ) || spuriousENOTAVAIL()); ++ {
if == nil {
.Close()
}
, = internetSocket(, .network, , , syscall.SOCK_STREAM, 0, "dial", .Dialer.Control)
}
if != nil {
return nil,
}
return newTCPConn(), 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,
}
:= newTCPConn()
if .lc.KeepAlive >= 0 {
setKeepAlive(, true)
:= .lc.KeepAlive
if .lc.KeepAlive == 0 {
= defaultTCPKeepAlive
}
setKeepAlivePeriod(, )
}
return , 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) {
, := internetSocket(, .network, , nil, syscall.SOCK_STREAM, 0, "listen", .ListenConfig.Control)
if != nil {
return nil,
}
return &TCPListener{fd: , lc: .ListenConfig}, nil
}