Skip to content

Commit 456cf0f

Browse files
committed
net: fix inconsistent error values on Interface
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 <[email protected]>
1 parent 2173a27 commit 456cf0f

6 files changed

+56
-45
lines changed

src/net/interface.go

+32-12
Original file line numberDiff line numberDiff line change
@@ -62,41 +62,61 @@ func (f Flags) String() string {
6262
// Addrs returns interface addresses for a specific interface.
6363
func (ifi *Interface) Addrs() ([]Addr, error) {
6464
if ifi == nil {
65-
return nil, errInvalidInterface
65+
return nil, &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: errInvalidInterface}
6666
}
67-
return interfaceAddrTable(ifi)
67+
ifat, err := interfaceAddrTable(ifi)
68+
if err != nil {
69+
err = &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: err}
70+
}
71+
return ifat, err
6872
}
6973

7074
// MulticastAddrs returns multicast, joined group addresses for
7175
// a specific interface.
7276
func (ifi *Interface) MulticastAddrs() ([]Addr, error) {
7377
if ifi == nil {
74-
return nil, errInvalidInterface
78+
return nil, &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: errInvalidInterface}
79+
}
80+
ifat, err := interfaceMulticastAddrTable(ifi)
81+
if err != nil {
82+
err = &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: err}
7583
}
76-
return interfaceMulticastAddrTable(ifi)
84+
return ifat, err
7785
}
7886

7987
// Interfaces returns a list of the system's network interfaces.
8088
func Interfaces() ([]Interface, error) {
81-
return interfaceTable(0)
89+
ift, err := interfaceTable(0)
90+
if err != nil {
91+
err = &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: err}
92+
}
93+
return ift, err
8294
}
8395

8496
// InterfaceAddrs returns a list of the system's network interface
8597
// addresses.
8698
func InterfaceAddrs() ([]Addr, error) {
87-
return interfaceAddrTable(nil)
99+
ifat, err := interfaceAddrTable(nil)
100+
if err != nil {
101+
err = &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: err}
102+
}
103+
return ifat, err
88104
}
89105

90106
// InterfaceByIndex returns the interface specified by index.
91107
func InterfaceByIndex(index int) (*Interface, error) {
92108
if index <= 0 {
93-
return nil, errInvalidInterfaceIndex
109+
return nil, &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: errInvalidInterfaceIndex}
94110
}
95111
ift, err := interfaceTable(index)
96112
if err != nil {
97-
return nil, err
113+
return nil, &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: err}
98114
}
99-
return interfaceByIndex(ift, index)
115+
ifi, err := interfaceByIndex(ift, index)
116+
if err != nil {
117+
err = &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: err}
118+
}
119+
return ifi, err
100120
}
101121

102122
func interfaceByIndex(ift []Interface, index int) (*Interface, error) {
@@ -111,16 +131,16 @@ func interfaceByIndex(ift []Interface, index int) (*Interface, error) {
111131
// InterfaceByName returns the interface specified by name.
112132
func InterfaceByName(name string) (*Interface, error) {
113133
if name == "" {
114-
return nil, errInvalidInterfaceName
134+
return nil, &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: errInvalidInterfaceName}
115135
}
116136
ift, err := interfaceTable(0)
117137
if err != nil {
118-
return nil, err
138+
return nil, &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: err}
119139
}
120140
for _, ifi := range ift {
121141
if name == ifi.Name {
122142
return &ifi, nil
123143
}
124144
}
125-
return nil, errNoSuchInterface
145+
return nil, &OpError{Op: "route", Net: "ip+net", Addr: nil, Err: errNoSuchInterface}
126146
}

src/net/interface_bsd.go

+6-7
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
package net
88

99
import (
10-
"os"
1110
"syscall"
1211
"unsafe"
1312
)
@@ -18,11 +17,11 @@ import (
1817
func interfaceTable(ifindex int) ([]Interface, error) {
1918
tab, err := syscall.RouteRIB(syscall.NET_RT_IFLIST, ifindex)
2019
if err != nil {
21-
return nil, os.NewSyscallError("route rib", err)
20+
return nil, err
2221
}
2322
msgs, err := syscall.ParseRoutingMessage(tab)
2423
if err != nil {
25-
return nil, os.NewSyscallError("route message", err)
24+
return nil, err
2625
}
2726
return parseInterfaceTable(ifindex, msgs)
2827
}
@@ -51,7 +50,7 @@ loop:
5150
func newLink(m *syscall.InterfaceMessage) (*Interface, error) {
5251
sas, err := syscall.ParseRoutingSockaddr(m)
5352
if err != nil {
54-
return nil, os.NewSyscallError("route sockaddr", err)
53+
return nil, err
5554
}
5655
ifi := &Interface{Index: int(m.Header.Index), Flags: linkFlags(m.Header.Flags)}
5756
sa, _ := sas[syscall.RTAX_IFP].(*syscall.SockaddrDatalink)
@@ -104,11 +103,11 @@ func interfaceAddrTable(ifi *Interface) ([]Addr, error) {
104103
}
105104
tab, err := syscall.RouteRIB(syscall.NET_RT_IFLIST, index)
106105
if err != nil {
107-
return nil, os.NewSyscallError("route rib", err)
106+
return nil, err
108107
}
109108
msgs, err := syscall.ParseRoutingMessage(tab)
110109
if err != nil {
111-
return nil, os.NewSyscallError("route message", err)
110+
return nil, err
112111
}
113112
var ift []Interface
114113
if index == 0 {
@@ -145,7 +144,7 @@ func interfaceAddrTable(ifi *Interface) ([]Addr, error) {
145144
func newAddr(ifi *Interface, m *syscall.InterfaceAddrMessage) (*IPNet, error) {
146145
sas, err := syscall.ParseRoutingSockaddr(m)
147146
if err != nil {
148-
return nil, os.NewSyscallError("route sockaddr", err)
147+
return nil, err
149148
}
150149
ifa := &IPNet{}
151150
switch sa := sas[syscall.RTAX_NETMASK].(type) {

src/net/interface_darwin.go

+4-7
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,18 @@
44

55
package net
66

7-
import (
8-
"os"
9-
"syscall"
10-
)
7+
import "syscall"
118

129
// interfaceMulticastAddrTable returns addresses for a specific
1310
// interface.
1411
func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
1512
tab, err := syscall.RouteRIB(syscall.NET_RT_IFLIST2, ifi.Index)
1613
if err != nil {
17-
return nil, os.NewSyscallError("route rib", err)
14+
return nil, err
1815
}
1916
msgs, err := syscall.ParseRoutingMessage(tab)
2017
if err != nil {
21-
return nil, os.NewSyscallError("route message", err)
18+
return nil, err
2219
}
2320
var ifmat []Addr
2421
for _, m := range msgs {
@@ -41,7 +38,7 @@ func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
4138
func newMulticastAddr(ifi *Interface, m *syscall.InterfaceMulticastAddrMessage) (*IPAddr, error) {
4239
sas, err := syscall.ParseRoutingSockaddr(m)
4340
if err != nil {
44-
return nil, os.NewSyscallError("route sockaddr", err)
41+
return nil, err
4542
}
4643
switch sa := sas[syscall.RTAX_IFA].(type) {
4744
case *syscall.SockaddrInet4:

src/net/interface_freebsd.go

+4-7
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,18 @@
44

55
package net
66

7-
import (
8-
"os"
9-
"syscall"
10-
)
7+
import "syscall"
118

129
// interfaceMulticastAddrTable returns addresses for a specific
1310
// interface.
1411
func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
1512
tab, err := syscall.RouteRIB(syscall.NET_RT_IFMALIST, ifi.Index)
1613
if err != nil {
17-
return nil, os.NewSyscallError("route rib", err)
14+
return nil, err
1815
}
1916
msgs, err := syscall.ParseRoutingMessage(tab)
2017
if err != nil {
21-
return nil, os.NewSyscallError("route message", err)
18+
return nil, err
2219
}
2320
var ifmat []Addr
2421
for _, m := range msgs {
@@ -41,7 +38,7 @@ func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
4138
func newMulticastAddr(ifi *Interface, m *syscall.InterfaceMulticastAddrMessage) (*IPAddr, error) {
4239
sas, err := syscall.ParseRoutingSockaddr(m)
4340
if err != nil {
44-
return nil, os.NewSyscallError("route sockaddr", err)
41+
return nil, err
4542
}
4643
switch sa := sas[syscall.RTAX_IFA].(type) {
4744
case *syscall.SockaddrInet4:

src/net/interface_linux.go

+6-7
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package net
66

77
import (
8-
"os"
98
"syscall"
109
"unsafe"
1110
)
@@ -16,11 +15,11 @@ import (
1615
func interfaceTable(ifindex int) ([]Interface, error) {
1716
tab, err := syscall.NetlinkRIB(syscall.RTM_GETLINK, syscall.AF_UNSPEC)
1817
if err != nil {
19-
return nil, os.NewSyscallError("netlink rib", err)
18+
return nil, err
2019
}
2120
msgs, err := syscall.ParseNetlinkMessage(tab)
2221
if err != nil {
23-
return nil, os.NewSyscallError("netlink message", err)
22+
return nil, err
2423
}
2524
var ift []Interface
2625
loop:
@@ -33,7 +32,7 @@ loop:
3332
if ifindex == 0 || ifindex == int(ifim.Index) {
3433
attrs, err := syscall.ParseNetlinkRouteAttr(&m)
3534
if err != nil {
36-
return nil, os.NewSyscallError("netlink routeattr", err)
35+
return nil, err
3736
}
3837
ift = append(ift, *newLink(ifim, attrs))
3938
if ifindex == int(ifim.Index) {
@@ -120,11 +119,11 @@ func linkFlags(rawFlags uint32) Flags {
120119
func interfaceAddrTable(ifi *Interface) ([]Addr, error) {
121120
tab, err := syscall.NetlinkRIB(syscall.RTM_GETADDR, syscall.AF_UNSPEC)
122121
if err != nil {
123-
return nil, os.NewSyscallError("netlink rib", err)
122+
return nil, err
124123
}
125124
msgs, err := syscall.ParseNetlinkMessage(tab)
126125
if err != nil {
127-
return nil, os.NewSyscallError("netlink message", err)
126+
return nil, err
128127
}
129128
var ift []Interface
130129
if ifi == nil {
@@ -160,7 +159,7 @@ loop:
160159
}
161160
attrs, err := syscall.ParseNetlinkRouteAttr(&m)
162161
if err != nil {
163-
return nil, os.NewSyscallError("netlink routeattr", err)
162+
return nil, err
164163
}
165164
ifa := newAddr(ifi, ifam, attrs)
166165
if ifa != nil {

src/net/interface_windows.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package net
66

77
import (
88
"internal/syscall/windows"
9-
"os"
109
"syscall"
1110
"unsafe"
1211
)
@@ -27,7 +26,7 @@ func getAdapters() (*windows.IpAdapterAddresses, error) {
2726
break
2827
}
2928
if err.(syscall.Errno) != syscall.ERROR_BUFFER_OVERFLOW {
30-
return nil, os.NewSyscallError("GetAdaptersAddresses", err)
29+
return nil, err
3130
}
3231
}
3332
return &addrs[0], nil
@@ -36,16 +35,16 @@ func getAdapters() (*windows.IpAdapterAddresses, error) {
3635
func getInterfaceInfos() ([]syscall.InterfaceInfo, error) {
3736
s, err := sysSocket(syscall.AF_INET, syscall.SOCK_DGRAM, syscall.IPPROTO_UDP)
3837
if err != nil {
39-
return nil, os.NewSyscallError("Socket", err)
38+
return nil, err
4039
}
41-
defer syscall.Closesocket(s)
40+
defer closeFunc(s)
4241

4342
iia := [20]syscall.InterfaceInfo{}
4443
ret := uint32(0)
4544
size := uint32(unsafe.Sizeof(iia))
4645
err = syscall.WSAIoctl(s, syscall.SIO_GET_INTERFACE_LIST, nil, 0, (*byte)(unsafe.Pointer(&iia[0])), size, &ret, nil, 0)
4746
if err != nil {
48-
return nil, os.NewSyscallError("WSAIoctl", err)
47+
return nil, err
4948
}
5049
iilen := ret / uint32(unsafe.Sizeof(iia[0]))
5150
return iia[:iilen-1], nil

0 commit comments

Comments
 (0)