~ubuntu-branches/ubuntu/utopic/golang/utopic

« back to all changes in this revision

Viewing changes to src/pkg/net/sockoptip_linux.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:
2
2
// Use of this source code is governed by a BSD-style
3
3
// license that can be found in the LICENSE file.
4
4
 
5
 
// IP-level socket options for Linux
6
 
 
7
5
package net
8
6
 
9
7
import (
11
9
        "syscall"
12
10
)
13
11
 
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
 
        mreq, err := syscall.GetsockoptIPMreqn(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF)
20
 
        if err != nil {
21
 
                return nil, os.NewSyscallError("getsockopt", err)
22
 
        }
23
 
        if int(mreq.Ifindex) == 0 {
24
 
                return nil, nil
25
 
        }
26
 
        return InterfaceByIndex(int(mreq.Ifindex))
27
 
}
28
 
 
29
12
func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error {
30
13
        var v int32
31
14
        if ifi != nil {
43
26
        return nil
44
27
}
45
28
 
46
 
func ipv4MulticastTTL(fd *netFD) (int, error) {
47
 
        if err := fd.incref(false); err != nil {
48
 
                return 0, err
49
 
        }
50
 
        defer fd.decref()
51
 
        v, err := syscall.GetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_TTL)
52
 
        if err != nil {
53
 
                return -1, os.NewSyscallError("getsockopt", err)
54
 
        }
55
 
        return v, nil
56
 
}
57
 
 
58
 
func setIPv4MulticastTTL(fd *netFD, v int) error {
59
 
        if err := fd.incref(false); err != nil {
60
 
                return err
61
 
        }
62
 
        defer fd.decref()
63
 
        err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_TTL, v)
64
 
        if err != nil {
65
 
                return os.NewSyscallError("setsockopt", err)
66
 
        }
67
 
        return nil
68
 
}
69
 
 
70
 
func ipv4MulticastLoopback(fd *netFD) (bool, error) {
71
 
        if err := fd.incref(false); err != nil {
72
 
                return false, err
73
 
        }
74
 
        defer fd.decref()
75
 
        v, err := syscall.GetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP)
76
 
        if err != nil {
77
 
                return false, os.NewSyscallError("getsockopt", err)
78
 
        }
79
 
        return v == 1, nil
80
 
}
81
 
 
82
29
func setIPv4MulticastLoopback(fd *netFD, v bool) error {
83
30
        if err := fd.incref(false); err != nil {
84
31
                return err
90
37
        }
91
38
        return nil
92
39
}
93
 
 
94
 
func ipv4ReceiveInterface(fd *netFD) (bool, error) {
95
 
        if err := fd.incref(false); err != nil {
96
 
                return false, err
97
 
        }
98
 
        defer fd.decref()
99
 
        v, err := syscall.GetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_PKTINFO)
100
 
        if err != nil {
101
 
                return false, os.NewSyscallError("getsockopt", err)
102
 
        }
103
 
        return v == 1, nil
104
 
}
105
 
 
106
 
func setIPv4ReceiveInterface(fd *netFD, v bool) error {
107
 
        if err := fd.incref(false); err != nil {
108
 
                return err
109
 
        }
110
 
        defer fd.decref()
111
 
        err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_PKTINFO, boolint(v))
112
 
        if err != nil {
113
 
                return os.NewSyscallError("setsockopt", err)
114
 
        }
115
 
        return nil
116
 
}
117
 
 
118
 
func ipv6TrafficClass(fd *netFD) (int, error) {
119
 
        if err := fd.incref(false); err != nil {
120
 
                return 0, err
121
 
        }
122
 
        defer fd.decref()
123
 
        v, err := syscall.GetsockoptInt(fd.sysfd, syscall.IPPROTO_IPV6, syscall.IPV6_TCLASS)
124
 
        if err != nil {
125
 
                return 0, os.NewSyscallError("getsockopt", err)
126
 
        }
127
 
        return v, nil
128
 
}
129
 
 
130
 
func setIPv6TrafficClass(fd *netFD, v int) error {
131
 
        if err := fd.incref(false); err != nil {
132
 
                return err
133
 
        }
134
 
        defer fd.decref()
135
 
        err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IPV6, syscall.IPV6_TCLASS, v)
136
 
        if err != nil {
137
 
                return os.NewSyscallError("setsockopt", err)
138
 
        }
139
 
        return nil
140
 
}