aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikio Hara <mikioh.mikioh@gmail.com>2011-08-31 13:05:49 -0400
committerRuss Cox <rsc@golang.org>2011-08-31 13:05:49 -0400
commit0c6581cc25e95b554d810b1fbbb912390f235afe (patch)
tree081c6d21fa8325a865eac5a93c7d51cd219b70b5
parent0c9ea63b3b3cc7bbbd7309cc8ca1751f3ea58ba0 (diff)
downloadgo-0c6581cc25e95b554d810b1fbbb912390f235afe.tar.gz
go-0c6581cc25e95b554d810b1fbbb912390f235afe.zip
syscall: handle routing entry in ParseRoutingSockaddr on BSD variants
R=golang-dev, rsc CC=golang-dev https://golang.org/cl/4972053
-rw-r--r--src/pkg/syscall/route_bsd.go49
1 files changed, 46 insertions, 3 deletions
diff --git a/src/pkg/syscall/route_bsd.go b/src/pkg/syscall/route_bsd.go
index 93e345d717..22a0a4f80e 100644
--- a/src/pkg/syscall/route_bsd.go
+++ b/src/pkg/syscall/route_bsd.go
@@ -72,9 +72,52 @@ type RouteMessage struct {
Data []byte
}
-func (m *RouteMessage) sockaddr() (sas []Sockaddr) {
- // TODO: implement this in the near future
- return nil
+const rtaRtMask = RTA_DST | RTA_GATEWAY | RTA_NETMASK | RTA_GENMASK
+
+func (m *RouteMessage) sockaddr() []Sockaddr {
+ var (
+ af int
+ sas [4]Sockaddr
+ )
+
+ buf := m.Data[:]
+ for i := uint(0); i < RTAX_MAX; i++ {
+ if m.Header.Addrs&rtaRtMask&(1<<i) == 0 {
+ continue
+ }
+ rsa := (*RawSockaddr)(unsafe.Pointer(&buf[0]))
+ switch i {
+ case RTAX_DST, RTAX_GATEWAY:
+ sa, e := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa)))
+ if e != 0 {
+ return nil
+ }
+ if i == RTAX_DST {
+ af = int(rsa.Family)
+ }
+ sas[i] = sa
+ case RTAX_NETMASK, RTAX_GENMASK:
+ switch af {
+ case AF_INET:
+ rsa4 := (*RawSockaddrInet4)(unsafe.Pointer(&buf[0]))
+ sa := new(SockaddrInet4)
+ for j := 0; rsa4.Len > 0 && j < int(rsa4.Len)-int(unsafe.Offsetof(rsa4.Addr)); j++ {
+ sa.Addr[j] = rsa4.Addr[j]
+ }
+ sas[i] = sa
+ case AF_INET6:
+ rsa6 := (*RawSockaddrInet6)(unsafe.Pointer(&buf[0]))
+ sa := new(SockaddrInet6)
+ for j := 0; rsa6.Len > 0 && j < int(rsa6.Len)-int(unsafe.Offsetof(rsa6.Addr)); j++ {
+ sa.Addr[j] = rsa6.Addr[j]
+ }
+ sas[i] = sa
+ }
+ }
+ buf = buf[rsaAlignOf(int(rsa.Len)):]
+ }
+
+ return sas[:]
}
// InterfaceMessage represents a routing message containing