From 735c65fa9c8569a8d40411056f6cfa7dbe28a689 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Sat, 10 Oct 2015 04:15:48 +0000 Subject: [PATCH] os: make IsPermission, IsExist, and IsNotExist unwrap SyscallError too Fixes #12674 Change-Id: I82f53026dd2fc27bd7999d43c27932d683d92af6 Reviewed-on: https://go-review.googlesource.com/15730 Reviewed-by: Ian Lance Taylor Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/os/error_plan9.go | 6 ++++++ src/os/error_test.go | 19 +++++++++++++++++++ src/os/error_unix.go | 6 ++++++ src/os/error_windows.go | 6 ++++++ 4 files changed, 37 insertions(+) diff --git a/src/os/error_plan9.go b/src/os/error_plan9.go index 001cdfcf2e..2dc6b39c39 100644 --- a/src/os/error_plan9.go +++ b/src/os/error_plan9.go @@ -12,6 +12,8 @@ func isExist(err error) bool { err = pe.Err case *LinkError: err = pe.Err + case *SyscallError: + err = pe.Err } return contains(err.Error(), " exists") } @@ -24,6 +26,8 @@ func isNotExist(err error) bool { err = pe.Err case *LinkError: err = pe.Err + case *SyscallError: + err = pe.Err } return contains(err.Error(), "does not exist") || contains(err.Error(), "not found") || contains(err.Error(), "has been removed") || contains(err.Error(), "no parent") @@ -37,6 +41,8 @@ func isPermission(err error) bool { err = pe.Err case *LinkError: err = pe.Err + case *SyscallError: + err = pe.Err } return contains(err.Error(), "permission denied") } diff --git a/src/os/error_test.go b/src/os/error_test.go index 02ed2351c5..5477e7ecbd 100644 --- a/src/os/error_test.go +++ b/src/os/error_test.go @@ -93,6 +93,8 @@ var isExistTests = []struct { {&os.LinkError{Err: os.ErrPermission}, false, false}, {&os.LinkError{Err: os.ErrExist}, true, false}, {&os.LinkError{Err: os.ErrNotExist}, false, true}, + {&os.SyscallError{Err: os.ErrNotExist}, false, true}, + {&os.SyscallError{Err: os.ErrExist}, true, false}, {nil, false, false}, } @@ -107,6 +109,23 @@ func TestIsExist(t *testing.T) { } } +var isPermissionTests = []struct { + err error + want bool +}{ + {nil, false}, + {&os.PathError{Err: os.ErrPermission}, true}, + {&os.SyscallError{Err: os.ErrPermission}, true}, +} + +func TestIsPermission(t *testing.T) { + for _, tt := range isPermissionTests { + if got := os.IsPermission(tt.err); got != tt.want { + t.Errorf("os.IsPermission(%#v) = %v; want %v", tt.err, got, tt.want) + } + } +} + func TestErrPathNUL(t *testing.T) { f, err := ioutil.TempFile("", "_Go_ErrPathNUL\x00") if err == nil { diff --git a/src/os/error_unix.go b/src/os/error_unix.go index f2aabbb45c..c6002279da 100644 --- a/src/os/error_unix.go +++ b/src/os/error_unix.go @@ -16,6 +16,8 @@ func isExist(err error) bool { err = pe.Err case *LinkError: err = pe.Err + case *SyscallError: + err = pe.Err } return err == syscall.EEXIST || err == ErrExist } @@ -28,6 +30,8 @@ func isNotExist(err error) bool { err = pe.Err case *LinkError: err = pe.Err + case *SyscallError: + err = pe.Err } return err == syscall.ENOENT || err == ErrNotExist } @@ -40,6 +44,8 @@ func isPermission(err error) bool { err = pe.Err case *LinkError: err = pe.Err + case *SyscallError: + err = pe.Err } return err == syscall.EACCES || err == syscall.EPERM || err == ErrPermission } diff --git a/src/os/error_windows.go b/src/os/error_windows.go index 6e2ece1227..2c1c39c414 100644 --- a/src/os/error_windows.go +++ b/src/os/error_windows.go @@ -14,6 +14,8 @@ func isExist(err error) bool { err = pe.Err case *LinkError: err = pe.Err + case *SyscallError: + err = pe.Err } return err == syscall.ERROR_ALREADY_EXISTS || err == syscall.ERROR_FILE_EXISTS || err == ErrExist @@ -29,6 +31,8 @@ func isNotExist(err error) bool { err = pe.Err case *LinkError: err = pe.Err + case *SyscallError: + err = pe.Err } return err == syscall.ERROR_FILE_NOT_FOUND || err == _ERROR_BAD_NETPATH || @@ -43,6 +47,8 @@ func isPermission(err error) bool { err = pe.Err case *LinkError: err = pe.Err + case *SyscallError: + err = pe.Err } return err == syscall.ERROR_ACCESS_DENIED || err == ErrPermission } -- 2.50.0