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