libgo: update to Go 1.11
[official-gcc.git] / libgo / go / net / sockopt_posix.go
blob29edddbf3746a056c2b80fda74de5b54cd6903cb
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 aix darwin dragonfly freebsd linux netbsd openbsd solaris windows
7 package net
9 import (
10 "runtime"
11 "syscall"
14 // Boolean to int.
15 func boolint(b bool) int {
16 if b {
17 return 1
19 return 0
22 func ipv4AddrToInterface(ip IP) (*Interface, error) {
23 ift, err := Interfaces()
24 if err != nil {
25 return nil, err
27 for _, ifi := range ift {
28 ifat, err := ifi.Addrs()
29 if err != nil {
30 return nil, err
32 for _, ifa := range ifat {
33 switch v := ifa.(type) {
34 case *IPAddr:
35 if ip.Equal(v.IP) {
36 return &ifi, nil
38 case *IPNet:
39 if ip.Equal(v.IP) {
40 return &ifi, nil
45 if ip.Equal(IPv4zero) {
46 return nil, nil
48 return nil, errNoSuchInterface
51 func interfaceToIPv4Addr(ifi *Interface) (IP, error) {
52 if ifi == nil {
53 return IPv4zero, nil
55 ifat, err := ifi.Addrs()
56 if err != nil {
57 return nil, err
59 for _, ifa := range ifat {
60 switch v := ifa.(type) {
61 case *IPAddr:
62 if v.IP.To4() != nil {
63 return v.IP, nil
65 case *IPNet:
66 if v.IP.To4() != nil {
67 return v.IP, nil
71 return nil, errNoSuchInterface
74 func setIPv4MreqToInterface(mreq *syscall.IPMreq, ifi *Interface) error {
75 if ifi == nil {
76 return nil
78 ifat, err := ifi.Addrs()
79 if err != nil {
80 return err
82 for _, ifa := range ifat {
83 switch v := ifa.(type) {
84 case *IPAddr:
85 if a := v.IP.To4(); a != nil {
86 copy(mreq.Interface[:], a)
87 goto done
89 case *IPNet:
90 if a := v.IP.To4(); a != nil {
91 copy(mreq.Interface[:], a)
92 goto done
96 done:
97 if bytesEqual(mreq.Multiaddr[:], IPv4zero.To4()) {
98 return errNoSuchMulticastInterface
100 return nil
103 func setReadBuffer(fd *netFD, bytes int) error {
104 err := fd.pfd.SetsockoptInt(syscall.SOL_SOCKET, syscall.SO_RCVBUF, bytes)
105 runtime.KeepAlive(fd)
106 return wrapSyscallError("setsockopt", err)
109 func setWriteBuffer(fd *netFD, bytes int) error {
110 err := fd.pfd.SetsockoptInt(syscall.SOL_SOCKET, syscall.SO_SNDBUF, bytes)
111 runtime.KeepAlive(fd)
112 return wrapSyscallError("setsockopt", err)
115 func setKeepAlive(fd *netFD, keepalive bool) error {
116 err := fd.pfd.SetsockoptInt(syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, boolint(keepalive))
117 runtime.KeepAlive(fd)
118 return wrapSyscallError("setsockopt", err)
121 func setLinger(fd *netFD, sec int) error {
122 var l syscall.Linger
123 if sec >= 0 {
124 l.Onoff = 1
125 l.Linger = int32(sec)
126 } else {
127 l.Onoff = 0
128 l.Linger = 0
130 err := fd.pfd.SetsockoptLinger(syscall.SOL_SOCKET, syscall.SO_LINGER, &l)
131 runtime.KeepAlive(fd)
132 return wrapSyscallError("setsockopt", err)