1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows
15 func boolint(b
bool) int {
22 func ipv4AddrToInterface(ip IP
) (*Interface
, error
) {
23 ift
, err
:= Interfaces()
27 for _
, ifi
:= range ift
{
28 ifat
, err
:= ifi
.Addrs()
32 for _
, ifa
:= range ifat
{
33 switch v
:= ifa
.(type) {
45 if ip
.Equal(IPv4zero
) {
48 return nil, errNoSuchInterface
51 func interfaceToIPv4Addr(ifi
*Interface
) (IP
, error
) {
55 ifat
, err
:= ifi
.Addrs()
59 for _
, ifa
:= range ifat
{
60 switch v
:= ifa
.(type) {
62 if v
.IP
.To4() != nil {
66 if v
.IP
.To4() != nil {
71 return nil, errNoSuchInterface
74 func setIPv4MreqToInterface(mreq
*syscall
.IPMreq
, ifi
*Interface
) error
{
78 ifat
, err
:= ifi
.Addrs()
82 for _
, ifa
:= range ifat
{
83 switch v
:= ifa
.(type) {
85 if a
:= v
.IP
.To4(); a
!= nil {
86 copy(mreq
.Interface
[:], a
)
90 if a
:= v
.IP
.To4(); a
!= nil {
91 copy(mreq
.Interface
[:], a
)
97 if bytesEqual(mreq
.Multiaddr
[:], IPv4zero
.To4()) {
98 return errNoSuchMulticastInterface
103 func setReadBuffer(fd
*netFD
, bytes
int) error
{
104 err
:= fd
.pfd
.SetsockoptInt(syscall
.SOL_SOCKET
, syscall
.SO_RCVBUF
, bytes
)
105 runtime
.KeepAlive(fd
)
106 return wrapSyscallError("setsockopt", err
)
109 func setWriteBuffer(fd
*netFD
, bytes
int) error
{
110 err
:= fd
.pfd
.SetsockoptInt(syscall
.SOL_SOCKET
, syscall
.SO_SNDBUF
, bytes
)
111 runtime
.KeepAlive(fd
)
112 return wrapSyscallError("setsockopt", err
)
115 func setKeepAlive(fd
*netFD
, keepalive
bool) error
{
116 err
:= fd
.pfd
.SetsockoptInt(syscall
.SOL_SOCKET
, syscall
.SO_KEEPALIVE
, boolint(keepalive
))
117 runtime
.KeepAlive(fd
)
118 return wrapSyscallError("setsockopt", err
)
121 func setLinger(fd
*netFD
, sec
int) error
{
125 l
.Linger
= int32(sec
)
130 err
:= fd
.pfd
.SetsockoptLinger(syscall
.SOL_SOCKET
, syscall
.SO_LINGER
, &l
)
131 runtime
.KeepAlive(fd
)
132 return wrapSyscallError("setsockopt", err
)