// 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)) } }