~ubuntu-branches/ubuntu/vivid/golang/vivid

« back to all changes in this revision

Viewing changes to src/pkg/net/sockoptip_darwin.go

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2013-08-20 14:06:23 UTC
  • mfrom: (14.1.23 saucy-proposed)
  • Revision ID: package-import@ubuntu.com-20130820140623-b414jfxi3m0qkmrq
Tags: 2:1.1.2-2ubuntu1
* Merge from Debian unstable (LP: #1211749, #1202027). Remaining changes:
  - 016-armhf-elf-header.patch: Use correct ELF header for armhf binaries.
  - d/control,control.cross: Update Breaks/Replaces for Ubuntu
    versions to ensure smooth upgrades, regenerate control file.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
}