2013-02-11 Sebastian Huber <sebastian.huber@embedded-brains.de>
[official-gcc.git] / libgo / go / net / sockoptip_posix.go
blobe4c56a0e4b2b0cd32cb1002a6d852ee4b8b71a94
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.
5 // +build darwin freebsd linux netbsd openbsd windows
7 package net
9 import (
10 "os"
11 "syscall"
14 func joinIPv4Group(fd *netFD, ifi *Interface, ip IP) error {
15 mreq := &syscall.IPMreq{Multiaddr: [4]byte{ip[0], ip[1], ip[2], ip[3]}}
16 if err := setIPv4MreqToInterface(mreq, ifi); err != nil {
17 return err
19 if err := fd.incref(false); err != nil {
20 return err
22 defer fd.decref()
23 err := syscall.SetsockoptIPMreq(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_ADD_MEMBERSHIP, mreq)
24 if err != nil {
25 return os.NewSyscallError("setsockopt", err)
27 return nil
30 func setIPv6MulticastInterface(fd *netFD, ifi *Interface) error {
31 var v int
32 if ifi != nil {
33 v = ifi.Index
35 if err := fd.incref(false); err != nil {
36 return err
38 defer fd.decref()
39 err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IPV6, syscall.IPV6_MULTICAST_IF, v)
40 if err != nil {
41 return os.NewSyscallError("setsockopt", err)
43 return nil
46 func setIPv6MulticastLoopback(fd *netFD, v bool) error {
47 if err := fd.incref(false); err != nil {
48 return err
50 defer fd.decref()
51 err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IPV6, syscall.IPV6_MULTICAST_LOOP, boolint(v))
52 if err != nil {
53 return os.NewSyscallError("setsockopt", err)
55 return nil
58 func joinIPv6Group(fd *netFD, ifi *Interface, ip IP) error {
59 mreq := &syscall.IPv6Mreq{}
60 copy(mreq.Multiaddr[:], ip)
61 if ifi != nil {
62 mreq.Interface = uint32(ifi.Index)
64 if err := fd.incref(false); err != nil {
65 return err
67 defer fd.decref()
68 err := syscall.SetsockoptIPv6Mreq(fd.sysfd, syscall.IPPROTO_IPV6, syscall.IPV6_JOIN_GROUP, mreq)
69 if err != nil {
70 return os.NewSyscallError("setsockopt", err)
72 return nil