mirror of
https://github.com/autc04/Retro68.git
synced 2024-09-08 20:55:01 +00:00
75 lines
2.1 KiB
Go
75 lines
2.1 KiB
Go
// Copyright 2015 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.
|
|
|
|
// +build darwin dragonfly freebsd
|
|
|
|
package syscall_test
|
|
|
|
import (
|
|
"fmt"
|
|
"syscall"
|
|
)
|
|
|
|
func parseRoutingMessageHeader(m syscall.RoutingMessage) (addrFlags, error) {
|
|
switch m := m.(type) {
|
|
case *syscall.RouteMessage:
|
|
errno := syscall.Errno(uintptr(m.Header.Errno))
|
|
if errno != 0 {
|
|
return 0, fmt.Errorf("%T: %v, %#v", m, errno, m.Header)
|
|
}
|
|
return addrFlags(m.Header.Addrs), nil
|
|
case *syscall.InterfaceMessage:
|
|
return addrFlags(m.Header.Addrs), nil
|
|
case *syscall.InterfaceAddrMessage:
|
|
return addrFlags(m.Header.Addrs), nil
|
|
case *syscall.InterfaceMulticastAddrMessage:
|
|
return addrFlags(m.Header.Addrs), nil
|
|
default:
|
|
panic(fmt.Sprintf("unknown routing message type: %T", m))
|
|
}
|
|
}
|
|
|
|
func parseRoutingSockaddrs(m syscall.RoutingMessage) ([]syscall.Sockaddr, error) {
|
|
switch m := m.(type) {
|
|
case *syscall.RouteMessage:
|
|
sas, err := syscall.ParseRoutingSockaddr(m)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%T: %v, %#v", m, err, m.Data)
|
|
}
|
|
if err = sockaddrs(sas).match(addrFlags(m.Header.Addrs)); err != nil {
|
|
return nil, err
|
|
}
|
|
return sas, nil
|
|
case *syscall.InterfaceMessage:
|
|
sas, err := syscall.ParseRoutingSockaddr(m)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%T: %v, %#v", m, err, m.Data)
|
|
}
|
|
if err = sockaddrs(sas).match(addrFlags(m.Header.Addrs)); err != nil {
|
|
return nil, err
|
|
}
|
|
return sas, nil
|
|
case *syscall.InterfaceAddrMessage:
|
|
sas, err := syscall.ParseRoutingSockaddr(m)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%T: %v, %#v", m, err, m.Data)
|
|
}
|
|
if err = sockaddrs(sas).match(addrFlags(m.Header.Addrs)); err != nil {
|
|
return nil, err
|
|
}
|
|
return sas, nil
|
|
case *syscall.InterfaceMulticastAddrMessage:
|
|
sas, err := syscall.ParseRoutingSockaddr(m)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%T: %v, %#v", m, err, m.Data)
|
|
}
|
|
if err = sockaddrs(sas).match(addrFlags(m.Header.Addrs)); err != nil {
|
|
return nil, err
|
|
}
|
|
return sas, nil
|
|
default:
|
|
panic(fmt.Sprintf("unknown routing message type: %T", m))
|
|
}
|
|
}
|