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 func setReadDeadline(fd *netFD, t time.Time) error {
126 fd.rdeadline = t.UnixNano()
131 func setWriteDeadline(fd *netFD, t time.Time) error {
135 fd.wdeadline = t.UnixNano()
140 func setDeadline(fd *netFD, t time.Time) error {
141 if err := setReadDeadline(fd, t); err != nil {
144 return setWriteDeadline(fd, t)
147 func setReuseAddr(fd *netFD, reuse bool) error {
148 if err := fd.incref(false); err != nil {
152 return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, boolint(reuse)))
155 func setDontRoute(fd *netFD, dontroute bool) error {
156 if err := fd.incref(false); err != nil {
160 return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_DONTROUTE, boolint(dontroute)))
163 func setKeepAlive(fd *netFD, keepalive bool) error {
164 if err := fd.incref(false); err != nil {
168 return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, boolint(keepalive)))
171 func setNoDelay(fd *netFD, noDelay bool) error {
172 if err := fd.incref(false); err != nil {
176 return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_NODELAY, boolint(noDelay)))
179 func setLinger(fd *netFD, sec int) error {
183 l.Linger = int32(sec)
188 if err := fd.incref(false); err != nil {
192 return os.NewSyscallError("setsockopt", syscall.SetsockoptLinger(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_LINGER, &l))