chore: retrying for "Cannot create a file when that file already exists."

This commit is contained in:
wwqgtxx 2022-10-14 08:27:34 +08:00
parent 0da49bd92b
commit c11a359761
4 changed files with 36 additions and 2 deletions

View file

@ -182,7 +182,7 @@ func New(options config.Tun, tcpIn chan<- C.ConnContext, udpIn chan<- *inbound.P
err = E.Cause(err, "build android rules")
return
}
tunIf, err := tun.Open(tunOptions)
tunIf, err := tunOpen(tunOptions)
if err != nil {
err = E.Cause(err, "configure tun interface")
return

View file

@ -0,0 +1,11 @@
//go:build !windows
package sing_tun
import (
tun "github.com/sagernet/sing-tun"
)
func tunOpen(options tun.Options) (tun.Tun, error) {
return tun.Open(options)
}

View file

@ -1,6 +1,29 @@
package sing_tun
import tun "github.com/sagernet/sing-tun"
import (
"time"
"github.com/Dreamacro/clash/log"
tun "github.com/sagernet/sing-tun"
)
func tunOpen(options tun.Options) (tunIf tun.Tun, err error) {
maxRetry := 3
for i := 0; i < maxRetry; i++ {
timeBegin := time.Now()
tunIf, err = tun.Open(options)
if err == nil {
return
}
timeEnd := time.Now()
if timeEnd.Sub(timeBegin) < 1*time.Second { // retrying for "Cannot create a file when that file already exists."
return
}
log.Warnln("Start Tun interface timeout: %s [retrying %d/%d]", err, i+1, maxRetry)
}
return
}
func init() {
tun.TunnelType = InterfaceName