package net
import (
"internal/bytealg"
"runtime"
"syscall"
)
func boolint (b bool ) int {
if b {
return 1
}
return 0
}
func ipv4AddrToInterface (ip IP ) (*Interface , error ) {
ift , err := Interfaces ()
if err != nil {
return nil , err
}
for _ , ifi := range ift {
ifat , err := ifi .Addrs ()
if err != nil {
return nil , err
}
for _ , ifa := range ifat {
switch v := ifa .(type ) {
case *IPAddr :
if ip .Equal (v .IP ) {
return &ifi , nil
}
case *IPNet :
if ip .Equal (v .IP ) {
return &ifi , nil
}
}
}
}
if ip .Equal (IPv4zero ) {
return nil , nil
}
return nil , errNoSuchInterface
}
func interfaceToIPv4Addr (ifi *Interface ) (IP , error ) {
if ifi == nil {
return IPv4zero , nil
}
ifat , err := ifi .Addrs ()
if err != nil {
return nil , err
}
for _ , ifa := range ifat {
switch v := ifa .(type ) {
case *IPAddr :
if v .IP .To4 () != nil {
return v .IP , nil
}
case *IPNet :
if v .IP .To4 () != nil {
return v .IP , nil
}
}
}
return nil , errNoSuchInterface
}
func setIPv4MreqToInterface (mreq *syscall .IPMreq , ifi *Interface ) error {
if ifi == nil {
return nil
}
ifat , err := ifi .Addrs ()
if err != nil {
return err
}
for _ , ifa := range ifat {
switch v := ifa .(type ) {
case *IPAddr :
if a := v .IP .To4 (); a != nil {
copy (mreq .Interface [:], a )
goto done
}
case *IPNet :
if a := v .IP .To4 (); a != nil {
copy (mreq .Interface [:], a )
goto done
}
}
}
done :
if bytealg .Equal (mreq .Multiaddr [:], IPv4zero .To4 ()) {
return errNoSuchMulticastInterface
}
return nil
}
func setReadBuffer (fd *netFD , bytes int ) error {
err := fd .pfd .SetsockoptInt (syscall .SOL_SOCKET , syscall .SO_RCVBUF , bytes )
runtime .KeepAlive (fd )
return wrapSyscallError ("setsockopt" , err )
}
func setWriteBuffer (fd *netFD , bytes int ) error {
err := fd .pfd .SetsockoptInt (syscall .SOL_SOCKET , syscall .SO_SNDBUF , bytes )
runtime .KeepAlive (fd )
return wrapSyscallError ("setsockopt" , err )
}
func setKeepAlive (fd *netFD , keepalive bool ) error {
err := fd .pfd .SetsockoptInt (syscall .SOL_SOCKET , syscall .SO_KEEPALIVE , boolint (keepalive ))
runtime .KeepAlive (fd )
return wrapSyscallError ("setsockopt" , err )
}
func setLinger (fd *netFD , sec int ) error {
var l syscall .Linger
if sec >= 0 {
l .Onoff = 1
l .Linger = int32 (sec )
} else {
l .Onoff = 0
l .Linger = 0
}
err := fd .pfd .SetsockoptLinger (syscall .SOL_SOCKET , syscall .SO_LINGER , &l )
runtime .KeepAlive (fd )
return wrapSyscallError ("setsockopt" , err )
}
The pages are generated with Golds v0.6.7 . (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 @Go100and1 (reachable from the left QR code) to get the latest news of Golds .