]> Cypherpunks repositories - gostls13.git/commitdiff
net: fix inconsistent error values on Interface
authorMikio Hara <mikioh.mikioh@gmail.com>
Sun, 19 Apr 2015 13:17:08 +0000 (22:17 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Tue, 21 Apr 2015 04:16:14 +0000 (04:16 +0000)
This change fixes inconsistent error values on Interfaces,
InterfaceAddrs, InterfaceBy{Index,Name}, and Addrs and MulticastAddrs
methods of Interface.

Updates #4856.

Change-Id: I09e65522a22f45c641792d774ebf7a0081b874ad
Reviewed-on: https://go-review.googlesource.com/9140
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/net/interface.go
src/net/interface_bsd.go
src/net/interface_darwin.go
src/net/interface_freebsd.go
src/net/interface_linux.go
src/net/interface_windows.go

index 2e9f1ebc6791f9ab7b4cbbab3b694ef4e43b4414..e6d874f53840307864bb603ab1dbe33b118e790d 100644 (file)
@@ -62,41 +62,61 @@ func (f Flags) String() string {
 // Addrs returns interface addresses for a specific interface.
 func (ifi *Interface) Addrs() ([]Addr, error) {
        if ifi == nil {
-               return nil, errInvalidInterface
+               return nil, &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: errInvalidInterface}
        }
-       return interfaceAddrTable(ifi)
+       ifat, err := interfaceAddrTable(ifi)
+       if err != nil {
+               err = &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: err}
+       }
+       return ifat, err
 }
 
 // MulticastAddrs returns multicast, joined group addresses for
 // a specific interface.
 func (ifi *Interface) MulticastAddrs() ([]Addr, error) {
        if ifi == nil {
-               return nil, errInvalidInterface
+               return nil, &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: errInvalidInterface}
+       }
+       ifat, err := interfaceMulticastAddrTable(ifi)
+       if err != nil {
+               err = &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: err}
        }
-       return interfaceMulticastAddrTable(ifi)
+       return ifat, err
 }
 
 // Interfaces returns a list of the system's network interfaces.
 func Interfaces() ([]Interface, error) {
-       return interfaceTable(0)
+       ift, err := interfaceTable(0)
+       if err != nil {
+               err = &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: err}
+       }
+       return ift, err
 }
 
 // InterfaceAddrs returns a list of the system's network interface
 // addresses.
 func InterfaceAddrs() ([]Addr, error) {
-       return interfaceAddrTable(nil)
+       ifat, err := interfaceAddrTable(nil)
+       if err != nil {
+               err = &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: err}
+       }
+       return ifat, err
 }
 
 // InterfaceByIndex returns the interface specified by index.
 func InterfaceByIndex(index int) (*Interface, error) {
        if index <= 0 {
-               return nil, errInvalidInterfaceIndex
+               return nil, &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: errInvalidInterfaceIndex}
        }
        ift, err := interfaceTable(index)
        if err != nil {
-               return nil, err
+               return nil, &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: err}
        }
-       return interfaceByIndex(ift, index)
+       ifi, err := interfaceByIndex(ift, index)
+       if err != nil {
+               err = &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: err}
+       }
+       return ifi, err
 }
 
 func interfaceByIndex(ift []Interface, index int) (*Interface, error) {
@@ -111,16 +131,16 @@ func interfaceByIndex(ift []Interface, index int) (*Interface, error) {
 // InterfaceByName returns the interface specified by name.
 func InterfaceByName(name string) (*Interface, error) {
        if name == "" {
-               return nil, errInvalidInterfaceName
+               return nil, &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: errInvalidInterfaceName}
        }
        ift, err := interfaceTable(0)
        if err != nil {
-               return nil, err
+               return nil, &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: err}
        }
        for _, ifi := range ift {
                if name == ifi.Name {
                        return &ifi, nil
                }
        }
-       return nil, errNoSuchInterface
+       return nil, &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: errNoSuchInterface}
 }
index 2f66e4fc3109252d42dcb30b53225f4283732597..01a67c69a15c47410f0b6aa7eaf697aa274ef0cb 100644 (file)
@@ -7,7 +7,6 @@
 package net
 
 import (
-       "os"
        "syscall"
        "unsafe"
 )
@@ -18,11 +17,11 @@ import (
 func interfaceTable(ifindex int) ([]Interface, error) {
        tab, err := syscall.RouteRIB(syscall.NET_RT_IFLIST, ifindex)
        if err != nil {
-               return nil, os.NewSyscallError("route rib", err)
+               return nil, err
        }
        msgs, err := syscall.ParseRoutingMessage(tab)
        if err != nil {
-               return nil, os.NewSyscallError("route message", err)
+               return nil, err
        }
        return parseInterfaceTable(ifindex, msgs)
 }
@@ -51,7 +50,7 @@ loop:
 func newLink(m *syscall.InterfaceMessage) (*Interface, error) {
        sas, err := syscall.ParseRoutingSockaddr(m)
        if err != nil {
-               return nil, os.NewSyscallError("route sockaddr", err)
+               return nil, err
        }
        ifi := &Interface{Index: int(m.Header.Index), Flags: linkFlags(m.Header.Flags)}
        sa, _ := sas[syscall.RTAX_IFP].(*syscall.SockaddrDatalink)
@@ -104,11 +103,11 @@ func interfaceAddrTable(ifi *Interface) ([]Addr, error) {
        }
        tab, err := syscall.RouteRIB(syscall.NET_RT_IFLIST, index)
        if err != nil {
-               return nil, os.NewSyscallError("route rib", err)
+               return nil, err
        }
        msgs, err := syscall.ParseRoutingMessage(tab)
        if err != nil {
-               return nil, os.NewSyscallError("route message", err)
+               return nil, err
        }
        var ift []Interface
        if index == 0 {
@@ -145,7 +144,7 @@ func interfaceAddrTable(ifi *Interface) ([]Addr, error) {
 func newAddr(ifi *Interface, m *syscall.InterfaceAddrMessage) (*IPNet, error) {
        sas, err := syscall.ParseRoutingSockaddr(m)
        if err != nil {
-               return nil, os.NewSyscallError("route sockaddr", err)
+               return nil, err
        }
        ifa := &IPNet{}
        switch sa := sas[syscall.RTAX_NETMASK].(type) {
index 475b8611ce0bb4980ba92b2211f43f5c07e7d231..bda6ff9a57d69b24612ee40c3ec6c4d03ce38fee 100644 (file)
@@ -4,21 +4,18 @@
 
 package net
 
-import (
-       "os"
-       "syscall"
-)
+import "syscall"
 
 // interfaceMulticastAddrTable returns addresses for a specific
 // interface.
 func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
        tab, err := syscall.RouteRIB(syscall.NET_RT_IFLIST2, ifi.Index)
        if err != nil {
-               return nil, os.NewSyscallError("route rib", err)
+               return nil, err
        }
        msgs, err := syscall.ParseRoutingMessage(tab)
        if err != nil {
-               return nil, os.NewSyscallError("route message", err)
+               return nil, err
        }
        var ifmat []Addr
        for _, m := range msgs {
@@ -41,7 +38,7 @@ func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
 func newMulticastAddr(ifi *Interface, m *syscall.InterfaceMulticastAddrMessage) (*IPAddr, error) {
        sas, err := syscall.ParseRoutingSockaddr(m)
        if err != nil {
-               return nil, os.NewSyscallError("route sockaddr", err)
+               return nil, err
        }
        switch sa := sas[syscall.RTAX_IFA].(type) {
        case *syscall.SockaddrInet4:
index 13bf438103789c679a1ff99844ddae79709f4a31..c759db4720e583e6c054e7527c210574610e9ad2 100644 (file)
@@ -4,21 +4,18 @@
 
 package net
 
-import (
-       "os"
-       "syscall"
-)
+import "syscall"
 
 // interfaceMulticastAddrTable returns addresses for a specific
 // interface.
 func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
        tab, err := syscall.RouteRIB(syscall.NET_RT_IFMALIST, ifi.Index)
        if err != nil {
-               return nil, os.NewSyscallError("route rib", err)
+               return nil, err
        }
        msgs, err := syscall.ParseRoutingMessage(tab)
        if err != nil {
-               return nil, os.NewSyscallError("route message", err)
+               return nil, err
        }
        var ifmat []Addr
        for _, m := range msgs {
@@ -41,7 +38,7 @@ func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
 func newMulticastAddr(ifi *Interface, m *syscall.InterfaceMulticastAddrMessage) (*IPAddr, error) {
        sas, err := syscall.ParseRoutingSockaddr(m)
        if err != nil {
-               return nil, os.NewSyscallError("route sockaddr", err)
+               return nil, err
        }
        switch sa := sas[syscall.RTAX_IFA].(type) {
        case *syscall.SockaddrInet4:
index 84d57c3c93fd426c7e86d9d231024686287c31df..3c117ea2f55240474cbc4b285cf18bbacf15cc7e 100644 (file)
@@ -5,7 +5,6 @@
 package net
 
 import (
-       "os"
        "syscall"
        "unsafe"
 )
@@ -16,11 +15,11 @@ import (
 func interfaceTable(ifindex int) ([]Interface, error) {
        tab, err := syscall.NetlinkRIB(syscall.RTM_GETLINK, syscall.AF_UNSPEC)
        if err != nil {
-               return nil, os.NewSyscallError("netlink rib", err)
+               return nil, err
        }
        msgs, err := syscall.ParseNetlinkMessage(tab)
        if err != nil {
-               return nil, os.NewSyscallError("netlink message", err)
+               return nil, err
        }
        var ift []Interface
 loop:
@@ -33,7 +32,7 @@ loop:
                        if ifindex == 0 || ifindex == int(ifim.Index) {
                                attrs, err := syscall.ParseNetlinkRouteAttr(&m)
                                if err != nil {
-                                       return nil, os.NewSyscallError("netlink routeattr", err)
+                                       return nil, err
                                }
                                ift = append(ift, *newLink(ifim, attrs))
                                if ifindex == int(ifim.Index) {
@@ -120,11 +119,11 @@ func linkFlags(rawFlags uint32) Flags {
 func interfaceAddrTable(ifi *Interface) ([]Addr, error) {
        tab, err := syscall.NetlinkRIB(syscall.RTM_GETADDR, syscall.AF_UNSPEC)
        if err != nil {
-               return nil, os.NewSyscallError("netlink rib", err)
+               return nil, err
        }
        msgs, err := syscall.ParseNetlinkMessage(tab)
        if err != nil {
-               return nil, os.NewSyscallError("netlink message", err)
+               return nil, err
        }
        var ift []Interface
        if ifi == nil {
@@ -160,7 +159,7 @@ loop:
                                }
                                attrs, err := syscall.ParseNetlinkRouteAttr(&m)
                                if err != nil {
-                                       return nil, os.NewSyscallError("netlink routeattr", err)
+                                       return nil, err
                                }
                                ifa := newAddr(ifi, ifam, attrs)
                                if ifa != nil {
index ac12e28a173d92e8545029af7809c978edb04160..83870efb10780bc416059bb3f35c0866022b18e8 100644 (file)
@@ -6,7 +6,6 @@ package net
 
 import (
        "internal/syscall/windows"
-       "os"
        "syscall"
        "unsafe"
 )
@@ -27,7 +26,7 @@ func getAdapters() (*windows.IpAdapterAddresses, error) {
                        break
                }
                if err.(syscall.Errno) != syscall.ERROR_BUFFER_OVERFLOW {
-                       return nil, os.NewSyscallError("GetAdaptersAddresses", err)
+                       return nil, err
                }
        }
        return &addrs[0], nil
@@ -36,16 +35,16 @@ func getAdapters() (*windows.IpAdapterAddresses, error) {
 func getInterfaceInfos() ([]syscall.InterfaceInfo, error) {
        s, err := sysSocket(syscall.AF_INET, syscall.SOCK_DGRAM, syscall.IPPROTO_UDP)
        if err != nil {
-               return nil, os.NewSyscallError("Socket", err)
+               return nil, err
        }
-       defer syscall.Closesocket(s)
+       defer closeFunc(s)
 
        iia := [20]syscall.InterfaceInfo{}
        ret := uint32(0)
        size := uint32(unsafe.Sizeof(iia))
        err = syscall.WSAIoctl(s, syscall.SIO_GET_INTERFACE_LIST, nil, 0, (*byte)(unsafe.Pointer(&iia[0])), size, &ret, nil, 0)
        if err != nil {
-               return nil, os.NewSyscallError("WSAIoctl", err)
+               return nil, err
        }
        iilen := ret / uint32(unsafe.Sizeof(iia[0]))
        return iia[:iilen-1], nil