aboutsummaryrefslogtreecommitdiff
path: root/src/syscall/route_ifma_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/syscall/route_ifma_test.go')
-rw-r--r--src/syscall/route_ifma_test.go74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/syscall/route_ifma_test.go b/src/syscall/route_ifma_test.go
new file mode 100644
index 0000000000..af2b67dc24
--- /dev/null
+++ b/src/syscall/route_ifma_test.go
@@ -0,0 +1,74 @@
+// 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))
+ }
+}