tun: use errors.Is for unwrapping
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
parent
5cdb862f15
commit
c040dea798
|
@ -6,6 +6,7 @@
|
||||||
package tun
|
package tun
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net"
|
"net"
|
||||||
|
@ -31,14 +32,10 @@ type NativeTun struct {
|
||||||
func retryInterfaceByIndex(index int) (iface *net.Interface, err error) {
|
func retryInterfaceByIndex(index int) (iface *net.Interface, err error) {
|
||||||
for i := 0; i < 20; i++ {
|
for i := 0; i < 20; i++ {
|
||||||
iface, err = net.InterfaceByIndex(index)
|
iface, err = net.InterfaceByIndex(index)
|
||||||
if err != nil {
|
if err != nil && errors.Is(err, syscall.ENOMEM) {
|
||||||
if opErr, ok := err.(*net.OpError); ok {
|
|
||||||
if syscallErr, ok := opErr.Err.(*os.SyscallError); ok && syscallErr.Err == syscall.ENOMEM {
|
|
||||||
time.Sleep(time.Duration(i) * time.Second / 3)
|
time.Sleep(time.Duration(i) * time.Second / 3)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
return iface, err
|
return iface, err
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
package tun
|
package tun
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net"
|
"net"
|
||||||
|
@ -99,16 +100,6 @@ func (tun *NativeTun) routineRouteListener(tunIfindex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func errorIsEBUSY(err error) bool {
|
|
||||||
if pe, ok := err.(*os.PathError); ok {
|
|
||||||
err = pe.Err
|
|
||||||
}
|
|
||||||
if errno, ok := err.(syscall.Errno); ok && errno == syscall.EBUSY {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func CreateTUN(name string, mtu int) (Device, error) {
|
func CreateTUN(name string, mtu int) (Device, error) {
|
||||||
ifIndex := -1
|
ifIndex := -1
|
||||||
if name != "tun" {
|
if name != "tun" {
|
||||||
|
@ -126,7 +117,7 @@ func CreateTUN(name string, mtu int) (Device, error) {
|
||||||
} else {
|
} else {
|
||||||
for ifIndex = 0; ifIndex < 256; ifIndex++ {
|
for ifIndex = 0; ifIndex < 256; ifIndex++ {
|
||||||
tunfile, err = os.OpenFile(fmt.Sprintf("/dev/tun%d", ifIndex), unix.O_RDWR, 0)
|
tunfile, err = os.OpenFile(fmt.Sprintf("/dev/tun%d", ifIndex), unix.O_RDWR, 0)
|
||||||
if err == nil || !errorIsEBUSY(err) {
|
if err == nil || !errors.Is(err, syscall.EBUSY) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue