]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: let ENOSYS, ENOTSUP and EOPNOTSUPP implement errors.ErrUnsupported
authorTobias Klauser <tklauser@distanz.ch>
Thu, 16 Mar 2023 09:59:04 +0000 (10:59 +0100)
committerTobias Klauser <tobias.klauser@gmail.com>
Thu, 16 Mar 2023 17:44:01 +0000 (17:44 +0000)
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>
src/internal/testenv/testenv_unix.go
src/syscall/syscall_js.go
src/syscall/syscall_plan9.go
src/syscall/syscall_unix.go
src/syscall/syscall_windows.go

index 92b5024f0b832548b782ffddf38a20e1bd1edda4..a629078842eadcbb904dd354fe5567ea8a28300f 100644 (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.
index c9c65229804c5df0c8501fbb4381d67dd5116c95..c1b28942e8e40e5e2f74bc6017edbfd86bf3058c 100644 (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
 }
index 759f8051e860f3ab7cbdc2ddb1b4108664e995eb..7af10ba322a881cf450a82450539d5f83c9765b9 100644 (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) ...
index c59d4fcf958aa54f417479bd1f2c6a5047dece9b..4c48f29744a70ae61a909a1acc255624a0f788d8 100644 (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
 }
index ae9b49a28d4ac7d071b7ef42512cbb84e0225947..fe052d7e72ed15dfdefd567d9eedd487c0d59416 100644 (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
 }