~ubuntu-branches/ubuntu/saucy/juju-core/saucy-proposed

« back to all changes in this revision

Viewing changes to src/code.google.com/p/go.net/ipv4/control_bsd.go

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2013-07-11 17:18:27 UTC
  • mfrom: (1.1.1)
  • Revision ID: package-import@ubuntu.com-20130711171827-vjqkg40r0dlf7ys2
Tags: 1.11.2-0ubuntu1
* New upstream release.
* Make juju-core the default juju (LP: #1190634):
  - d/control: Add virtual package juju -> juju-core.
  - d/juju-core.postinst.in: Bump priority of alternatives over that of
    python juju packages.
* Enable for all architectures (LP: #1172505):
  - d/control: Version BD on golang-go to >= 2:1.1.1 to ensure CGO
    support for non-x86 archs, make juju-core Arch: any.
  - d/README.source: Dropped - no longer required.
* d/watch: Updated for new upstream tarball naming.

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
)
15
15
 
16
16
func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error {
17
 
        opt.lock()
18
 
        defer opt.unlock()
 
17
        opt.Lock()
 
18
        defer opt.Unlock()
19
19
        if cf&FlagTTL != 0 {
20
20
                if err := setIPv4ReceiveTTL(fd, on); err != nil {
21
21
                        return err
50
50
}
51
51
 
52
52
func newControlMessage(opt *rawOpt) (oob []byte) {
53
 
        opt.lock()
54
 
        defer opt.unlock()
 
53
        opt.Lock()
 
54
        defer opt.Unlock()
 
55
        l, off := 0, 0
55
56
        if opt.isset(FlagTTL) {
56
 
                b := make([]byte, syscall.CmsgSpace(1))
57
 
                cmsg := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0]))
58
 
                cmsg.Level = syscall.IPPROTO_IP
59
 
                cmsg.Type = syscall.IP_RECVTTL
60
 
                cmsg.SetLen(syscall.CmsgLen(1))
61
 
                oob = append(oob, b...)
 
57
                l += syscall.CmsgSpace(1)
62
58
        }
63
59
        if opt.isset(FlagDst) {
64
 
                b := make([]byte, syscall.CmsgSpace(net.IPv4len))
65
 
                cmsg := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0]))
66
 
                cmsg.Level = syscall.IPPROTO_IP
67
 
                cmsg.Type = syscall.IP_RECVDSTADDR
68
 
                cmsg.SetLen(syscall.CmsgLen(net.IPv4len))
69
 
                oob = append(oob, b...)
 
60
                l += syscall.CmsgSpace(net.IPv4len)
70
61
        }
71
62
        if opt.isset(FlagInterface) {
72
 
                b := make([]byte, syscall.CmsgSpace(syscall.SizeofSockaddrDatalink))
73
 
                cmsg := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0]))
74
 
                cmsg.Level = syscall.IPPROTO_IP
75
 
                cmsg.Type = syscall.IP_RECVIF
76
 
                cmsg.SetLen(syscall.CmsgLen(syscall.SizeofSockaddrDatalink))
77
 
                oob = append(oob, b...)
 
63
                l += syscall.CmsgSpace(syscall.SizeofSockaddrDatalink)
 
64
        }
 
65
        if l > 0 {
 
66
                oob = make([]byte, l)
 
67
                if opt.isset(FlagTTL) {
 
68
                        m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off]))
 
69
                        m.Level = ianaProtocolIP
 
70
                        m.Type = syscall.IP_RECVTTL
 
71
                        m.SetLen(syscall.CmsgLen(1))
 
72
                        off += syscall.CmsgSpace(1)
 
73
                }
 
74
                if opt.isset(FlagDst) {
 
75
                        m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off]))
 
76
                        m.Level = ianaProtocolIP
 
77
                        m.Type = syscall.IP_RECVDSTADDR
 
78
                        m.SetLen(syscall.CmsgLen(net.IPv4len))
 
79
                        off += syscall.CmsgSpace(net.IPv4len)
 
80
                }
 
81
                if opt.isset(FlagInterface) {
 
82
                        m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off]))
 
83
                        m.Level = ianaProtocolIP
 
84
                        m.Type = syscall.IP_RECVIF
 
85
                        m.SetLen(syscall.CmsgLen(syscall.SizeofSockaddrDatalink))
 
86
                        off += syscall.CmsgSpace(syscall.SizeofSockaddrDatalink)
 
87
                }
78
88
        }
79
89
        return
80
90
}
81
91
 
82
92
func parseControlMessage(b []byte) (*ControlMessage, error) {
 
93
        if len(b) == 0 {
 
94
                return nil, nil
 
95
        }
83
96
        cmsgs, err := syscall.ParseSocketControlMessage(b)
84
97
        if err != nil {
85
98
                return nil, os.NewSyscallError("parse socket control message", err)
86
99
        }
87
 
        if len(b) == 0 {
88
 
                return nil, nil
89
 
        }
90
100
        cm := &ControlMessage{}
91
101
        for _, m := range cmsgs {
92
 
                if m.Header.Level != syscall.IPPROTO_IP {
 
102
                if m.Header.Level != ianaProtocolIP {
93
103
                        continue
94
104
                }
95
105
                switch m.Header.Type {
96
106
                case syscall.IP_RECVTTL:
97
107
                        cm.TTL = int(*(*byte)(unsafe.Pointer(&m.Data[:1][0])))
98
108
                case syscall.IP_RECVDSTADDR:
99
 
                        v := m.Data[:4]
100
 
                        cm.Dst = net.IPv4(v[0], v[1], v[2], v[3])
 
109
                        cm.Dst = m.Data[:net.IPv4len]
101
110
                case syscall.IP_RECVIF:
102
111
                        sadl := (*syscall.SockaddrDatalink)(unsafe.Pointer(&m.Data[0]))
103
112
                        cm.IfIndex = int(sadl.Index)