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 darwin freebsd linux netbsd openbsd windows
17 func boolint(b
bool) int {
24 func ipv4AddrToInterface(ip IP
) (*Interface
, error
) {
25 ift
, err
:= Interfaces()
29 for _
, ifi
:= range ift
{
30 ifat
, err
:= ifi
.Addrs()
34 for _
, ifa
:= range ifat
{
35 switch v
:= ifa
.(type) {
47 if ip
.Equal(IPv4zero
) {
50 return nil, errNoSuchInterface
53 func interfaceToIPv4Addr(ifi
*Interface
) (IP
, error
) {
57 ifat
, err
:= ifi
.Addrs()
61 for _
, ifa
:= range ifat
{
62 switch v
:= ifa
.(type) {
64 if v
.IP
.To4() != nil {
68 if v
.IP
.To4() != nil {
73 return nil, errNoSuchInterface
76 func setIPv4MreqToInterface(mreq
*syscall
.IPMreq
, ifi
*Interface
) error
{
80 ifat
, err
:= ifi
.Addrs()
84 for _
, ifa
:= range ifat
{
85 switch v
:= ifa
.(type) {
87 if a
:= v
.IP
.To4(); a
!= nil {
88 copy(mreq
.Interface
[:], a
)
92 if a
:= v
.IP
.To4(); a
!= nil {
93 copy(mreq
.Interface
[:], a
)
99 if bytesEqual(mreq
.Multiaddr
[:], IPv4zero
.To4()) {
100 return errNoSuchMulticastInterface
105 func setReadBuffer(fd
*netFD
, bytes
int) error
{
106 if err
:= fd
.incref(false); err
!= nil {
110 return os
.NewSyscallError("setsockopt", syscall
.SetsockoptInt(fd
.sysfd
, syscall
.SOL_SOCKET
, syscall
.SO_RCVBUF
, bytes
))
113 func setWriteBuffer(fd
*netFD
, bytes
int) error
{
114 if err
:= fd
.incref(false); err
!= nil {
118 return os
.NewSyscallError("setsockopt", syscall
.SetsockoptInt(fd
.sysfd
, syscall
.SOL_SOCKET
, syscall
.SO_SNDBUF
, bytes
))
121 func setKeepAlive(fd
*netFD
, keepalive
bool) error
{
122 if err
:= fd
.incref(false); err
!= nil {
126 return os
.NewSyscallError("setsockopt", syscall
.SetsockoptInt(fd
.sysfd
, syscall
.SOL_SOCKET
, syscall
.SO_KEEPALIVE
, boolint(keepalive
)))
129 func setNoDelay(fd
*netFD
, noDelay
bool) error
{
130 if err
:= fd
.incref(false); err
!= nil {
134 return os
.NewSyscallError("setsockopt", syscall
.SetsockoptInt(fd
.sysfd
, syscall
.IPPROTO_TCP
, syscall
.TCP_NODELAY
, boolint(noDelay
)))
137 func setLinger(fd
*netFD
, sec
int) error
{
141 l
.Linger
= int32(sec
)
146 if err
:= fd
.incref(false); err
!= nil {
150 return os
.NewSyscallError("setsockopt", syscall
.SetsockoptLinger(fd
.sysfd
, syscall
.SOL_SOCKET
, syscall
.SO_LINGER
, &l
))