Imported Upstream version 4.7.2
[platform/upstream/gcc48.git] / libgo / go / net / sockoptip_darwin.go
1 // Copyright 2011 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.
4
5 // IP-level socket options for Darwin
6
7 package net
8
9 import (
10         "os"
11         "syscall"
12 )
13
14 func ipv4MulticastInterface(fd *netFD) (*Interface, error) {
15         if err := fd.incref(false); err != nil {
16                 return nil, err
17         }
18         defer fd.decref()
19         a, err := syscall.GetsockoptInet4Addr(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF)
20         if err != nil {
21                 return nil, os.NewSyscallError("getsockopt", err)
22         }
23         return ipv4AddrToInterface(IPv4(a[0], a[1], a[2], a[3]))
24 }
25
26 func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error {
27         ip, err := interfaceToIPv4Addr(ifi)
28         if err != nil {
29                 return os.NewSyscallError("setsockopt", err)
30         }
31         var x [4]byte
32         copy(x[:], ip.To4())
33         if err := fd.incref(false); err != nil {
34                 return err
35         }
36         defer fd.decref()
37         err = syscall.SetsockoptInet4Addr(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF, x)
38         if err != nil {
39                 return os.NewSyscallError("setsockopt", err)
40         }
41         return nil
42 }
43
44 func ipv4MulticastLoopback(fd *netFD) (bool, error) {
45         if err := fd.incref(false); err != nil {
46                 return false, err
47         }
48         defer fd.decref()
49         v, err := syscall.GetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP)
50         if err != nil {
51                 return false, os.NewSyscallError("getsockopt", err)
52         }
53         return v == 1, nil
54 }
55
56 func setIPv4MulticastLoopback(fd *netFD, v bool) error {
57         if err := fd.incref(false); err != nil {
58                 return err
59         }
60         defer fd.decref()
61         err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, boolint(v))
62         if err != nil {
63                 return os.NewSyscallError("setsockopt", err)
64         }
65         return nil
66 }
67
68 func ipv4ReceiveInterface(fd *netFD) (bool, error) {
69         if err := fd.incref(false); err != nil {
70                 return false, err
71         }
72         defer fd.decref()
73         v, err := syscall.GetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_RECVIF)
74         if err != nil {
75                 return false, os.NewSyscallError("getsockopt", err)
76         }
77         return v == 1, nil
78 }
79
80 func setIPv4ReceiveInterface(fd *netFD, v bool) error {
81         if err := fd.incref(false); err != nil {
82                 return err
83         }
84         defer fd.decref()
85         err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_RECVIF, boolint(v))
86         if err != nil {
87                 return os.NewSyscallError("setsockopt", err)
88         }
89         return nil
90 }