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))