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
18 func boolint(b bool) int {
25 func ipv4AddrToInterface(ip IP) (*Interface, error) {
26 ift, err := Interfaces()
30 for _, ifi := range ift {
31 ifat, err := ifi.Addrs()
35 for _, ifa := range ifat {
36 switch v := ifa.(type) {
48 if ip.Equal(IPv4zero) {
51 return nil, errNoSuchInterface
54 func interfaceToIPv4Addr(ifi *Interface) (IP, error) {
58 ifat, err := ifi.Addrs()
62 for _, ifa := range ifat {
63 switch v := ifa.(type) {
65 if v.IP.To4() != nil {
69 if v.IP.To4() != nil {
74 return nil, errNoSuchInterface
77 func setIPv4MreqToInterface(mreq *syscall.IPMreq, ifi *Interface) error {
81 ifat, err := ifi.Addrs()
85 for _, ifa := range ifat {
86 switch v := ifa.(type) {
88 if a := v.IP.To4(); a != nil {
89 copy(mreq.Interface[:], a)
93 if a := v.IP.To4(); a != nil {
94 copy(mreq.Interface[:], a)
100 if bytesEqual(mreq.Multiaddr[:], IPv4zero.To4()) {
101 return errNoSuchMulticastInterface
106 func setReadBuffer(fd *netFD, bytes int) error {
107 if err := fd.incref(false); err != nil {
111 return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_RCVBUF, bytes))
114 func setWriteBuffer(fd *netFD, bytes int) error {
115 if err := fd.incref(false); err != nil {
119 return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_SNDBUF, bytes))
122 // TODO(dfc) these unused error returns could be removed
124 func setReadDeadline(fd *netFD, t time.Time) error {
125 fd.rdeadline.setTime(t)
129 func setWriteDeadline(fd *netFD, t time.Time) error {
130 fd.wdeadline.setTime(t)
134 func setDeadline(fd *netFD, t time.Time) error {
135 setReadDeadline(fd, t)
136 setWriteDeadline(fd, t)
140 func setKeepAlive(fd *netFD, keepalive bool) error {
141 if err := fd.incref(false); err != nil {
145 return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, boolint(keepalive)))
148 func setNoDelay(fd *netFD, noDelay bool) error {
149 if err := fd.incref(false); err != nil {
153 return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_NODELAY, boolint(noDelay)))
156 func setLinger(fd *netFD, sec int) error {
160 l.Linger = int32(sec)
165 if err := fd.incref(false); err != nil {
169 return os.NewSyscallError("setsockopt", syscall.SetsockoptLinger(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_LINGER, &l))