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

« back to all changes in this revision

Viewing changes to src/pkg/syscall/route_bsd.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:
8
8
 
9
9
package syscall
10
10
 
11
 
import (
12
 
        "unsafe"
13
 
)
 
11
import "unsafe"
14
12
 
15
13
// Round the length of a raw sockaddr up to align it properly.
16
14
func rsaAlignOf(salen int) int {
31
29
// parameters.
32
30
func RouteRIB(facility, param int) ([]byte, error) {
33
31
        mib := []_C_int{CTL_NET, AF_ROUTE, 0, 0, _C_int(facility), _C_int(param)}
34
 
 
35
32
        // Find size.
36
33
        n := uintptr(0)
37
34
        if err := sysctl(mib, nil, &n, nil, 0); err != nil {
40
37
        if n == 0 {
41
38
                return nil, nil
42
39
        }
43
 
 
44
40
        tab := make([]byte, n)
45
41
        if err := sysctl(mib, &tab[0], &n, nil, 0); err != nil {
46
42
                return nil, err
47
43
        }
48
 
 
49
44
        return tab[:n], nil
50
45
}
51
46
 
76
71
                af  int
77
72
                sas [4]Sockaddr
78
73
        )
79
 
 
80
 
        buf := m.Data[:]
 
74
        b := m.Data[:]
81
75
        for i := uint(0); i < RTAX_MAX; i++ {
82
76
                if m.Header.Addrs&rtaRtMask&(1<<i) == 0 {
83
77
                        continue
84
78
                }
85
 
                rsa := (*RawSockaddr)(unsafe.Pointer(&buf[0]))
 
79
                rsa := (*RawSockaddr)(unsafe.Pointer(&b[0]))
86
80
                switch i {
87
81
                case RTAX_DST, RTAX_GATEWAY:
88
82
                        sa, err := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa)))
96
90
                case RTAX_NETMASK, RTAX_GENMASK:
97
91
                        switch af {
98
92
                        case AF_INET:
99
 
                                rsa4 := (*RawSockaddrInet4)(unsafe.Pointer(&buf[0]))
 
93
                                rsa4 := (*RawSockaddrInet4)(unsafe.Pointer(&b[0]))
100
94
                                sa := new(SockaddrInet4)
101
95
                                for j := 0; rsa4.Len > 0 && j < int(rsa4.Len)-int(unsafe.Offsetof(rsa4.Addr)); j++ {
102
96
                                        sa.Addr[j] = rsa4.Addr[j]
103
97
                                }
104
98
                                sas[i] = sa
105
99
                        case AF_INET6:
106
 
                                rsa6 := (*RawSockaddrInet6)(unsafe.Pointer(&buf[0]))
 
100
                                rsa6 := (*RawSockaddrInet6)(unsafe.Pointer(&b[0]))
107
101
                                sa := new(SockaddrInet6)
108
102
                                for j := 0; rsa6.Len > 0 && j < int(rsa6.Len)-int(unsafe.Offsetof(rsa6.Addr)); j++ {
109
103
                                        sa.Addr[j] = rsa6.Addr[j]
111
105
                                sas[i] = sa
112
106
                        }
113
107
                }
114
 
                buf = buf[rsaAlignOf(int(rsa.Len)):]
 
108
                b = b[rsaAlignOf(int(rsa.Len)):]
115
109
        }
116
 
 
117
110
        return sas[:]
118
111
}
119
112
 
148
141
        if m.Header.Addrs&rtaIfaMask == 0 {
149
142
                return nil
150
143
        }
151
 
 
152
 
        buf := m.Data[:]
 
144
        b := m.Data[:]
153
145
        for i := uint(0); i < RTAX_MAX; i++ {
154
146
                if m.Header.Addrs&rtaIfaMask&(1<<i) == 0 {
155
147
                        continue
156
148
                }
157
 
                rsa := (*RawSockaddr)(unsafe.Pointer(&buf[0]))
 
149
                rsa := (*RawSockaddr)(unsafe.Pointer(&b[0]))
158
150
                switch i {
159
151
                case RTAX_IFA:
160
152
                        sa, err := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa)))
174
166
                case RTAX_BRD:
175
167
                        // nothing to do
176
168
                }
177
 
                buf = buf[rsaAlignOf(int(rsa.Len)):]
 
169
                b = b[rsaAlignOf(int(rsa.Len)):]
178
170
        }
179
 
 
180
171
        return sas
181
172
}
182
173
 
183
 
// ParseRoutingMessage parses buf as routing messages and returns
184
 
// the slice containing the RoutingMessage interfaces.
185
 
func ParseRoutingMessage(buf []byte) (msgs []RoutingMessage, err error) {
186
 
        for len(buf) >= anyMessageLen {
187
 
                any := (*anyMessage)(unsafe.Pointer(&buf[0]))
 
174
// ParseRoutingMessage parses b as routing messages and returns the
 
175
// slice containing the RoutingMessage interfaces.
 
176
func ParseRoutingMessage(b []byte) (msgs []RoutingMessage, err error) {
 
177
        for len(b) >= anyMessageLen {
 
178
                any := (*anyMessage)(unsafe.Pointer(&b[0]))
188
179
                if any.Version != RTM_VERSION {
189
180
                        return nil, EINVAL
190
181
                }
191
 
                msgs = append(msgs, any.toRoutingMessage(buf))
192
 
                buf = buf[any.Msglen:]
 
182
                msgs = append(msgs, any.toRoutingMessage(b))
 
183
                b = b[any.Msglen:]
193
184
        }
194
185
        return msgs, nil
195
186
}