diff --git a/src/internal/testenv/testenv_unix.go b/src/internal/testenv/testenv_unix.go index 92b5024f0b8..a629078842e 100644 --- a/src/internal/testenv/testenv_unix.go +++ b/src/internal/testenv/testenv_unix.go @@ -24,11 +24,6 @@ func syscallIsNotSupported(err error) bool { var errno syscall.Errno if errors.As(err, &errno) { switch errno { - case syscall.ENOSYS, syscall.ENOTSUP: - // Explicitly not supported. - // TODO(#41198): remove these cases when errors.Is reports that they are - // equivalent to ErrUnsupported. - return true case syscall.EPERM, syscall.EROFS: // User lacks permission: either the call requires root permission and the // user is not root, or the call is denied by a container security policy. diff --git a/src/syscall/syscall_js.go b/src/syscall/syscall_js.go index c9c65229804..c1b28942e8e 100644 --- a/src/syscall/syscall_js.go +++ b/src/syscall/syscall_js.go @@ -7,6 +7,7 @@ package syscall import ( + errorspkg "errors" "internal/itoa" "internal/oserror" "sync" @@ -47,8 +48,8 @@ const PathMax = 256 // err = errno // } // -// Errno values can be tested against error values from the os package -// using errors.Is. For example: +// Errno values can be tested against error values using errors.Is. +// For example: // // _, _, err := syscall.Syscall(...) // if errors.Is(err, fs.ErrNotExist) ... @@ -72,6 +73,8 @@ func (e Errno) Is(target error) bool { return e == EEXIST || e == ENOTEMPTY case oserror.ErrNotExist: return e == ENOENT + case errorspkg.ErrUnsupported: + return e == ENOSYS || e == ENOTSUP || e == EOPNOTSUPP } return false } diff --git a/src/syscall/syscall_plan9.go b/src/syscall/syscall_plan9.go index 759f8051e86..7af10ba322a 100644 --- a/src/syscall/syscall_plan9.go +++ b/src/syscall/syscall_plan9.go @@ -23,8 +23,8 @@ const bitSize16 = 2 // ErrorString implements Error's String method by returning itself. // -// ErrorString values can be tested against error values from the os package -// using errors.Is. For example: +// ErrorString values can be tested against error values using errors.Is. +// For example: // // _, _, err := syscall.Syscall(...) // if errors.Is(err, fs.ErrNotExist) ... diff --git a/src/syscall/syscall_unix.go b/src/syscall/syscall_unix.go index c59d4fcf958..4c48f29744a 100644 --- a/src/syscall/syscall_unix.go +++ b/src/syscall/syscall_unix.go @@ -7,6 +7,7 @@ package syscall import ( + errorspkg "errors" "internal/bytealg" "internal/itoa" "internal/oserror" @@ -97,8 +98,8 @@ func (m *mmapper) Munmap(data []byte) (err error) { // err = errno // } // -// Errno values can be tested against error values from the os package -// using errors.Is. For example: +// Errno values can be tested against error values using errors.Is. +// For example: // // _, _, err := syscall.Syscall(...) // if errors.Is(err, fs.ErrNotExist) ... @@ -122,6 +123,8 @@ func (e Errno) Is(target error) bool { return e == EEXIST || e == ENOTEMPTY case oserror.ErrNotExist: return e == ENOENT + case errorspkg.ErrUnsupported: + return e == ENOSYS || e == ENOTSUP || e == EOPNOTSUPP } return false } diff --git a/src/syscall/syscall_windows.go b/src/syscall/syscall_windows.go index ae9b49a28d4..fe052d7e72e 100644 --- a/src/syscall/syscall_windows.go +++ b/src/syscall/syscall_windows.go @@ -103,8 +103,8 @@ func UTF16PtrFromString(s string) (*uint16, error) { // Errno is the Windows error number. // -// Errno values can be tested against error values from the os package -// using errors.Is. For example: +// Errno values can be tested against error values using errors.Is. +// For example: // // _, _, err := syscall.Syscall(...) // if errors.Is(err, fs.ErrNotExist) ... @@ -147,17 +147,25 @@ const _ERROR_BAD_NETPATH = Errno(53) func (e Errno) Is(target error) bool { switch target { case oserror.ErrPermission: - return e == ERROR_ACCESS_DENIED + return e == ERROR_ACCESS_DENIED || + e == EACCES || + e == EPERM case oserror.ErrExist: return e == ERROR_ALREADY_EXISTS || e == ERROR_DIR_NOT_EMPTY || - e == ERROR_FILE_EXISTS + e == ERROR_FILE_EXISTS || + e == EEXIST || + e == ENOTEMPTY case oserror.ErrNotExist: return e == ERROR_FILE_NOT_FOUND || e == _ERROR_BAD_NETPATH || - e == ERROR_PATH_NOT_FOUND + e == ERROR_PATH_NOT_FOUND || + e == ENOENT case errorspkg.ErrUnsupported: - return e == EWINDOWS + return e == ENOSYS || + e == ENOTSUP || + e == EOPNOTSUPP || + e == EWINDOWS } return false }