mirror of
https://github.com/golang/go
synced 2024-11-17 11:54:54 -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:
parent
8377f2014d
commit
75c2e97c3c
@ -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.
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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) ...
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user