From 2f2eca894744baef365aaa07554f56979159d988 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Thu, 24 May 2018 15:29:16 +0200 Subject: Catch EINTR --- tun/tun_freebsd.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'tun/tun_freebsd.go') diff --git a/tun/tun_freebsd.go b/tun/tun_freebsd.go index bd70104..435ff91 100644 --- a/tun/tun_freebsd.go +++ b/tun/tun_freebsd.go @@ -6,14 +6,15 @@ package tun import ( - "git.zx2c4.com/wireguard-go/rwcancel" "bytes" "errors" "fmt" + "git.zx2c4.com/wireguard-go/rwcancel" "golang.org/x/net/ipv6" "golang.org/x/sys/unix" "net" "os" + "syscall" "unsafe" ) @@ -67,8 +68,12 @@ func (tun *nativeTun) routineRouteListener(tunIfindex int) { data := make([]byte, os.Getpagesize()) for { + retry: n, err := unix.Read(tun.routeSocket, data) if err != nil { + if errno, ok := err.(syscall.Errno); ok && errno == syscall.EINTR { + goto retry + } tun.errors <- err return } @@ -392,7 +397,7 @@ func (tun *nativeTun) doRead(buff []byte, offset int) (int, error) { func (tun *nativeTun) Read(buff []byte, offset int) (int, error) { for { n, err := tun.doRead(buff, offset) - if err == nil || !rwcancel.ErrorIsEAGAIN(err) { + if err == nil || !rwcancel.RetryAfterError(err) { return n, err } if !tun.rwcancel.ReadyRead() { -- cgit v1.2.3-59-g8ed1b