~nskaggs/+junk/xenial-test

« back to all changes in this revision

Viewing changes to src/golang.org/x/net/ipv6/sockopt_unix.go

  • Committer: Nicholas Skaggs
  • Date: 2016-10-24 20:56:05 UTC
  • Revision ID: nicholas.skaggs@canonical.com-20161024205605-z8lta0uvuhtxwzwl
Initi with beta15

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2013 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
// +build darwin dragonfly freebsd linux netbsd openbsd
 
6
 
 
7
package ipv6
 
8
 
 
9
import (
 
10
        "net"
 
11
        "os"
 
12
        "unsafe"
 
13
)
 
14
 
 
15
func getInt(fd int, opt *sockOpt) (int, error) {
 
16
        if opt.name < 1 || opt.typ != ssoTypeInt {
 
17
                return 0, errOpNoSupport
 
18
        }
 
19
        var i int32
 
20
        l := sysSockoptLen(4)
 
21
        if err := getsockopt(fd, opt.level, opt.name, unsafe.Pointer(&i), &l); err != nil {
 
22
                return 0, os.NewSyscallError("getsockopt", err)
 
23
        }
 
24
        return int(i), nil
 
25
}
 
26
 
 
27
func setInt(fd int, opt *sockOpt, v int) error {
 
28
        if opt.name < 1 || opt.typ != ssoTypeInt {
 
29
                return errOpNoSupport
 
30
        }
 
31
        i := int32(v)
 
32
        return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, unsafe.Pointer(&i), sysSockoptLen(4)))
 
33
}
 
34
 
 
35
func getInterface(fd int, opt *sockOpt) (*net.Interface, error) {
 
36
        if opt.name < 1 || opt.typ != ssoTypeInterface {
 
37
                return nil, errOpNoSupport
 
38
        }
 
39
        var i int32
 
40
        l := sysSockoptLen(4)
 
41
        if err := getsockopt(fd, opt.level, opt.name, unsafe.Pointer(&i), &l); err != nil {
 
42
                return nil, os.NewSyscallError("getsockopt", err)
 
43
        }
 
44
        if i == 0 {
 
45
                return nil, nil
 
46
        }
 
47
        ifi, err := net.InterfaceByIndex(int(i))
 
48
        if err != nil {
 
49
                return nil, err
 
50
        }
 
51
        return ifi, nil
 
52
}
 
53
 
 
54
func setInterface(fd int, opt *sockOpt, ifi *net.Interface) error {
 
55
        if opt.name < 1 || opt.typ != ssoTypeInterface {
 
56
                return errOpNoSupport
 
57
        }
 
58
        var i int32
 
59
        if ifi != nil {
 
60
                i = int32(ifi.Index)
 
61
        }
 
62
        return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, unsafe.Pointer(&i), sysSockoptLen(4)))
 
63
}
 
64
 
 
65
func getICMPFilter(fd int, opt *sockOpt) (*ICMPFilter, error) {
 
66
        if opt.name < 1 || opt.typ != ssoTypeICMPFilter {
 
67
                return nil, errOpNoSupport
 
68
        }
 
69
        var f ICMPFilter
 
70
        l := sysSockoptLen(sysSizeofICMPv6Filter)
 
71
        if err := getsockopt(fd, opt.level, opt.name, unsafe.Pointer(&f.sysICMPv6Filter), &l); err != nil {
 
72
                return nil, os.NewSyscallError("getsockopt", err)
 
73
        }
 
74
        return &f, nil
 
75
}
 
76
 
 
77
func setICMPFilter(fd int, opt *sockOpt, f *ICMPFilter) error {
 
78
        if opt.name < 1 || opt.typ != ssoTypeICMPFilter {
 
79
                return errOpNoSupport
 
80
        }
 
81
        return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, unsafe.Pointer(&f.sysICMPv6Filter), sysSizeofICMPv6Filter))
 
82
}
 
83
 
 
84
func getMTUInfo(fd int, opt *sockOpt) (*net.Interface, int, error) {
 
85
        if opt.name < 1 || opt.typ != ssoTypeMTUInfo {
 
86
                return nil, 0, errOpNoSupport
 
87
        }
 
88
        var mi sysIPv6Mtuinfo
 
89
        l := sysSockoptLen(sysSizeofIPv6Mtuinfo)
 
90
        if err := getsockopt(fd, opt.level, opt.name, unsafe.Pointer(&mi), &l); err != nil {
 
91
                return nil, 0, os.NewSyscallError("getsockopt", err)
 
92
        }
 
93
        if mi.Addr.Scope_id == 0 {
 
94
                return nil, int(mi.Mtu), nil
 
95
        }
 
96
        ifi, err := net.InterfaceByIndex(int(mi.Addr.Scope_id))
 
97
        if err != nil {
 
98
                return nil, 0, err
 
99
        }
 
100
        return ifi, int(mi.Mtu), nil
 
101
}
 
102
 
 
103
func setGroup(fd int, opt *sockOpt, ifi *net.Interface, grp net.IP) error {
 
104
        if opt.name < 1 {
 
105
                return errOpNoSupport
 
106
        }
 
107
        switch opt.typ {
 
108
        case ssoTypeIPMreq:
 
109
                return setsockoptIPMreq(fd, opt, ifi, grp)
 
110
        case ssoTypeGroupReq:
 
111
                return setsockoptGroupReq(fd, opt, ifi, grp)
 
112
        default:
 
113
                return errOpNoSupport
 
114
        }
 
115
}
 
116
 
 
117
func setSourceGroup(fd int, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error {
 
118
        if opt.name < 1 || opt.typ != ssoTypeGroupSourceReq {
 
119
                return errOpNoSupport
 
120
        }
 
121
        return setsockoptGroupSourceReq(fd, opt, ifi, grp, src)
 
122
}