blob: 52b237c4b8db8ba77984d7fd64c845501bad815e [file] [log] [blame]
Mikio Haracbdbdc42012-01-11 09:53:32 +09001// 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
7package net
8
9import (
10 "os"
11 "syscall"
12)
13
14func ipv4MulticastInterface(fd *netFD) (*Interface, error) {
Russ Cox5e4e3d82012-02-14 00:40:37 -050015 if err := fd.incref(false); err != nil {
16 return nil, err
17 }
Mikio Haracbdbdc42012-01-11 09:53:32 +090018 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
26func 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())
Russ Cox5e4e3d82012-02-14 00:40:37 -050033 if err := fd.incref(false); err != nil {
34 return err
35 }
Mikio Haracbdbdc42012-01-11 09:53:32 +090036 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
44func ipv4MulticastLoopback(fd *netFD) (bool, error) {
Russ Cox5e4e3d82012-02-14 00:40:37 -050045 if err := fd.incref(false); err != nil {
46 return false, err
47 }
Mikio Haracbdbdc42012-01-11 09:53:32 +090048 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
56func setIPv4MulticastLoopback(fd *netFD, v bool) error {
Russ Cox5e4e3d82012-02-14 00:40:37 -050057 if err := fd.incref(false); err != nil {
58 return err
59 }
Mikio Haracbdbdc42012-01-11 09:53:32 +090060 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
68func ipv4ReceiveInterface(fd *netFD) (bool, error) {
Russ Cox5e4e3d82012-02-14 00:40:37 -050069 if err := fd.incref(false); err != nil {
70 return false, err
71 }
Mikio Haracbdbdc42012-01-11 09:53:32 +090072 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
80func setIPv4ReceiveInterface(fd *netFD, v bool) error {
Russ Cox5e4e3d82012-02-14 00:40:37 -050081 if err := fd.incref(false); err != nil {
82 return err
83 }
Mikio Haracbdbdc42012-01-11 09:53:32 +090084 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}