]> Cypherpunks repositories - gostls13.git/commitdiff
os: make IsPermission, IsExist, and IsNotExist unwrap SyscallError too
authorBrad Fitzpatrick <bradfitz@golang.org>
Sat, 10 Oct 2015 04:15:48 +0000 (04:15 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Sat, 10 Oct 2015 21:20:14 +0000 (21:20 +0000)
Fixes #12674

Change-Id: I82f53026dd2fc27bd7999d43c27932d683d92af6
Reviewed-on: https://go-review.googlesource.com/15730
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/os/error_plan9.go
src/os/error_test.go
src/os/error_unix.go
src/os/error_windows.go

index 001cdfcf2e3376aed7273ddbd1a28c7b663b7995..2dc6b39c39595b43fe0aa134d5ad6e4c3b92c158 100644 (file)
@@ -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")
 }
index 02ed2351c5c0a95c91ce614a7b2fe9f26be7a1b7..5477e7ecbdbe6eddfe4f6aff4f03a7ec49ab995b 100644 (file)
@@ -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 {
index f2aabbb45c43b5282ce97d1225cd08d568c826fd..c6002279da68314b579c7648c674668bbaad8db6 100644 (file)
@@ -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
 }
index 6e2ece12273a0ce5fe412bc6184c40096b1aea5c..2c1c39c414b1414b8dea1af3494619161aeb80be 100644 (file)
@@ -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
 }