1
0
mirror of https://github.com/golang/go synced 2024-11-17 09:04:44 -07:00

syscall: let ENOSYS, ENOTSUP and EOPNOTSUPP implement errors.ErrUnsupported

As suggested by Bryan, also update (Errno).Is on windows to include the
missing oserror cases that are covered on other platforms.

Quoting Bryan:
> Windows syscalls don't actually return those errors, but the dummy Errno
> constants defined on Windows should still have the same meaning as on
> Unix.

Updates #41198

Change-Id: I15441abde4a7ebaa3c6518262c052530cd2add4b
Reviewed-on: https://go-review.googlesource.com/c/go/+/476875
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
This commit is contained in:
Tobias Klauser 2023-03-16 10:59:04 +01:00 committed by Tobias Klauser
parent 8377f2014d
commit 75c2e97c3c
5 changed files with 26 additions and 17 deletions

View File

@ -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.

View File

@ -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
}

View File

@ -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) ...

View File

@ -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
}

View File

@ -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
}