Fix "PR c++/92804 ICE trying to use concept as a nested-name-specifier"
[official-gcc.git] / libgo / go / net / interface_freebsd.go
blob45badd64954a17d087eab9a9540b94acd2d938e4
1 // Copyright 2011 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 package net
7 import (
8 "syscall"
10 "golang.org/x/net/route"
13 func interfaceMessages(ifindex int) ([]route.Message, error) {
14 typ := route.RIBType(syscall.NET_RT_IFLISTL)
15 rib, err := route.FetchRIB(syscall.AF_UNSPEC, typ, ifindex)
16 if err != nil {
17 typ = route.RIBType(syscall.NET_RT_IFLIST)
18 rib, err = route.FetchRIB(syscall.AF_UNSPEC, typ, ifindex)
20 if err != nil {
21 return nil, err
23 return route.ParseRIB(typ, rib)
26 // interfaceMulticastAddrTable returns addresses for a specific
27 // interface.
28 func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
29 rib, err := route.FetchRIB(syscall.AF_UNSPEC, syscall.NET_RT_IFMALIST, ifi.Index)
30 if err != nil {
31 return nil, err
33 msgs, err := route.ParseRIB(syscall.NET_RT_IFMALIST, rib)
34 if err != nil {
35 return nil, err
37 ifmat := make([]Addr, 0, len(msgs))
38 for _, m := range msgs {
39 switch m := m.(type) {
40 case *route.InterfaceMulticastAddrMessage:
41 if ifi.Index != m.Index {
42 continue
44 var ip IP
45 switch sa := m.Addrs[syscall.RTAX_IFA].(type) {
46 case *route.Inet4Addr:
47 ip = IPv4(sa.IP[0], sa.IP[1], sa.IP[2], sa.IP[3])
48 case *route.Inet6Addr:
49 ip = make(IP, IPv6len)
50 copy(ip, sa.IP[:])
52 if ip != nil {
53 ifmat = append(ifmat, &IPAddr{IP: ip})
57 return ifmat, nil