--- libgo/go/syscall/route_bsdsunix.go.orig 2020-03-04 19:30:03.000000000 +1100 +++ libgo/go/syscall/route_bsdsunix.go 2020-09-22 00:20:28.672028000 +1000 @@ -0,0 +1,106 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package syscall + +import "unsafe" + +// See http://www.bsdsunix.org/doc/en/books/porters-handbook/bsdsunix-versions.html. +var bsdsunixVersion uint32 + +func init() { + bsdsunixVersion, _ = SysctlUint32("kern.osreldate") + conf, _ := Sysctl("kern.conftxt") + for i, j := 0, 0; j < len(conf); j++ { + if conf[j] != '\n' { + continue + } + s := conf[i:j] + i = j + 1 + if len(s) > len("machine") && s[:len("machine")] == "machine" { + s = s[len("machine"):] + for k := 0; k < len(s); k++ { + if s[k] == ' ' || s[k] == '\t' { + s = s[1:] + } + break + } + bsdsunixConfArch = s + break + } + } +} + +func (any *anyMessage) toRoutingMessage(b []byte) RoutingMessage { + switch any.Type { + case RTM_ADD, RTM_DELETE, RTM_CHANGE, RTM_GET, RTM_LOSING, RTM_REDIRECT, RTM_MISS, RTM_LOCK, RTM_RESOLVE: + return any.parseRouteMessage(b) + case RTM_IFINFO: + return any.parseInterfaceMessage(b) + case RTM_IFANNOUNCE: + p := (*InterfaceAnnounceMessage)(unsafe.Pointer(any)) + return &InterfaceAnnounceMessage{Header: p.Header} + case RTM_NEWADDR, RTM_DELADDR: + p := (*InterfaceAddrMessage)(unsafe.Pointer(any)) + return &InterfaceAddrMessage{Header: p.Header, Data: b[SizeofIfaMsghdr:any.Msglen]} + case RTM_NEWMADDR, RTM_DELMADDR: + p := (*InterfaceMulticastAddrMessage)(unsafe.Pointer(any)) + return &InterfaceMulticastAddrMessage{Header: p.Header, Data: b[SizeofIfmaMsghdr:any.Msglen]} + } + return nil +} + +// InterfaceAnnounceMessage represents a routing message containing +// network interface arrival and departure information. +// +// Deprecated: Use golang.org/x/net/route instead. +type InterfaceAnnounceMessage struct { + Header IfAnnounceMsghdr +} + +func (m *InterfaceAnnounceMessage) sockaddr() ([]Sockaddr, error) { return nil, nil } + +// InterfaceMulticastAddrMessage represents a routing message +// containing network interface address entries. +// +// Deprecated: Use golang.org/x/net/route instead. +type InterfaceMulticastAddrMessage struct { + Header IfmaMsghdr + Data []byte +} + +func (m *InterfaceMulticastAddrMessage) sockaddr() ([]Sockaddr, error) { + var sas [RTAX_MAX]Sockaddr + b := m.Data[:] + for i := uint(0); i < RTAX_MAX && len(b) >= minRoutingSockaddrLen; i++ { + if m.Header.Addrs&(1<