libgo: Update to Go 1.1.1.
[official-gcc.git] / libgo / go / net / sockopt_posix.go
blob1590f4e98de38780df0a2d678eca1b6774f619a3
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
7 // Socket options
9 package net
11 import (
12 "os"
13 "syscall"
16 // Boolean to int.
17 func boolint(b bool) int {
18 if b {
19 return 1
21 return 0
24 func ipv4AddrToInterface(ip IP) (*Interface, error) {
25 ift, err := Interfaces()
26 if err != nil {
27 return nil, err
29 for _, ifi := range ift {
30 ifat, err := ifi.Addrs()
31 if err != nil {
32 return nil, err
34 for _, ifa := range ifat {
35 switch v := ifa.(type) {
36 case *IPAddr:
37 if ip.Equal(v.IP) {
38 return &ifi, nil
40 case *IPNet:
41 if ip.Equal(v.IP) {
42 return &ifi, nil
47 if ip.Equal(IPv4zero) {
48 return nil, nil
50 return nil, errNoSuchInterface
53 func interfaceToIPv4Addr(ifi *Interface) (IP, error) {
54 if ifi == nil {
55 return IPv4zero, nil
57 ifat, err := ifi.Addrs()
58 if err != nil {
59 return nil, err
61 for _, ifa := range ifat {
62 switch v := ifa.(type) {
63 case *IPAddr:
64 if v.IP.To4() != nil {
65 return v.IP, nil
67 case *IPNet:
68 if v.IP.To4() != nil {
69 return v.IP, nil
73 return nil, errNoSuchInterface
76 func setIPv4MreqToInterface(mreq *syscall.IPMreq, ifi *Interface) error {
77 if ifi == nil {
78 return nil
80 ifat, err := ifi.Addrs()
81 if err != nil {
82 return err
84 for _, ifa := range ifat {
85 switch v := ifa.(type) {
86 case *IPAddr:
87 if a := v.IP.To4(); a != nil {
88 copy(mreq.Interface[:], a)
89 goto done
91 case *IPNet:
92 if a := v.IP.To4(); a != nil {
93 copy(mreq.Interface[:], a)
94 goto done
98 done:
99 if bytesEqual(mreq.Multiaddr[:], IPv4zero.To4()) {
100 return errNoSuchMulticastInterface
102 return nil
105 func setReadBuffer(fd *netFD, bytes int) error {
106 if err := fd.incref(false); err != nil {
107 return err
109 defer fd.decref()
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 {
115 return err
117 defer fd.decref()
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 {
123 return err
125 defer fd.decref()
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 {
131 return err
133 defer fd.decref()
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 {
138 var l syscall.Linger
139 if sec >= 0 {
140 l.Onoff = 1
141 l.Linger = int32(sec)
142 } else {
143 l.Onoff = 0
144 l.Linger = 0
146 if err := fd.incref(false); err != nil {
147 return err
149 defer fd.decref()
150 return os.NewSyscallError("setsockopt", syscall.SetsockoptLinger(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_LINGER, &l))