mirror of
https://github.com/rclone/rclone.git
synced 2024-11-08 01:25:14 +01:00
798502b204
This makes a framework for adding temporary errors identified by syscall number or by error string. Fixes #1660
47 lines
1.0 KiB
Go
47 lines
1.0 KiB
Go
// +build !plan9
|
|
|
|
package fs
|
|
|
|
import (
|
|
"net"
|
|
"os"
|
|
"syscall"
|
|
)
|
|
|
|
// closedConnErrors indicate a connection is closed or broken and
|
|
// should be retried
|
|
//
|
|
// These are added to in closed_conn_win.go
|
|
var closedConnErrors = []syscall.Errno{
|
|
syscall.EPIPE,
|
|
syscall.ETIMEDOUT,
|
|
syscall.ECONNREFUSED,
|
|
syscall.EHOSTDOWN,
|
|
syscall.EHOSTUNREACH,
|
|
syscall.ECONNABORTED,
|
|
syscall.EAGAIN,
|
|
syscall.EWOULDBLOCK,
|
|
syscall.ECONNRESET,
|
|
}
|
|
|
|
// isClosedConnErrorPlatform reports whether err is an error from use
|
|
// of a closed network connection using platform specific error codes.
|
|
func isClosedConnErrorPlatform(err error) bool {
|
|
// now check whether err is an error from use of a closed
|
|
// network connection using platform specific error codes.
|
|
//
|
|
// Code adapted from net/http
|
|
if oe, ok := err.(*net.OpError); ok {
|
|
if se, ok := oe.Err.(*os.SyscallError); ok {
|
|
if errno, ok := se.Err.(syscall.Errno); ok {
|
|
for _, retriableErrno := range closedConnErrors {
|
|
if errno == retriableErrno {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false
|
|
}
|