diff options
Diffstat (limited to 'src/syscall/route_darwin.go')
-rw-r--r-- | src/syscall/route_darwin.go | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/src/syscall/route_darwin.go b/src/syscall/route_darwin.go index ad27907230..89bca12f3e 100644 --- a/src/syscall/route_darwin.go +++ b/src/syscall/route_darwin.go @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Routing sockets and messages for Darwin - package syscall import "unsafe" @@ -33,29 +31,37 @@ type InterfaceMulticastAddrMessage struct { Data []byte } -const rtaIfmaMask = RTA_GATEWAY | RTA_IFP | RTA_IFA - -func (m *InterfaceMulticastAddrMessage) sockaddr() (sas []Sockaddr) { - if m.Header.Addrs&rtaIfmaMask == 0 { - return nil - } +func (m *InterfaceMulticastAddrMessage) sockaddr() ([]Sockaddr, error) { + var sas [RTAX_MAX]Sockaddr b := m.Data[:] - for i := uint(0); i < RTAX_MAX; i++ { - if m.Header.Addrs&rtaIfmaMask&(1<<i) == 0 { + for i := uint(0); i < RTAX_MAX && len(b) >= minRoutingSockaddrLen; i++ { + if m.Header.Addrs&(1<<i) == 0 { continue } rsa := (*RawSockaddr)(unsafe.Pointer(&b[0])) - switch i { - case RTAX_IFA: - sa, e := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa))) - if e != nil { - return nil + switch rsa.Family { + case AF_LINK: + sa, err := parseSockaddrLink(b) + if err != nil { + return nil, err + } + sas[i] = sa + b = b[rsaAlignOf(int(rsa.Len)):] + case AF_INET, AF_INET6: + sa, err := parseSockaddrInet(b, rsa.Family) + if err != nil { + return nil, err + } + sas[i] = sa + b = b[rsaAlignOf(int(rsa.Len)):] + default: + sa, l, err := parseLinkLayerAddr(b) + if err != nil { + return nil, err } - sas = append(sas, sa) - case RTAX_GATEWAY, RTAX_IFP: - // nothing to do + sas[i] = sa + b = b[l:] } - b = b[rsaAlignOf(int(rsa.Len)):] } - return sas + return sas[:], nil } |