mirror of
https://github.com/golang/go
synced 2024-11-20 05:44:44 -07:00
212d2f82e0
This is clearer than syscall.EBADF. Fixes #17320. Change-Id: I14c6a362f9a6044c9b07cd7965499f4a83d2a860 Reviewed-on: https://go-review.googlesource.com/30614 Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
80 lines
2.3 KiB
Go
80 lines
2.3 KiB
Go
// Copyright 2009 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package os
|
|
|
|
import (
|
|
"errors"
|
|
)
|
|
|
|
// Portable analogs of some common system call errors.
|
|
var (
|
|
ErrInvalid = errors.New("invalid argument") // methods on File will return this error when the receiver is nil
|
|
ErrPermission = errors.New("permission denied")
|
|
ErrExist = errors.New("file already exists")
|
|
ErrNotExist = errors.New("file does not exist")
|
|
ErrClosed = errors.New("file already closed")
|
|
)
|
|
|
|
// PathError records an error and the operation and file path that caused it.
|
|
type PathError struct {
|
|
Op string
|
|
Path string
|
|
Err error
|
|
}
|
|
|
|
func (e *PathError) Error() string { return e.Op + " " + e.Path + ": " + e.Err.Error() }
|
|
|
|
// SyscallError records an error from a specific system call.
|
|
type SyscallError struct {
|
|
Syscall string
|
|
Err error
|
|
}
|
|
|
|
func (e *SyscallError) Error() string { return e.Syscall + ": " + e.Err.Error() }
|
|
|
|
// NewSyscallError returns, as an error, a new SyscallError
|
|
// with the given system call name and error details.
|
|
// As a convenience, if err is nil, NewSyscallError returns nil.
|
|
func NewSyscallError(syscall string, err error) error {
|
|
if err == nil {
|
|
return nil
|
|
}
|
|
return &SyscallError{syscall, err}
|
|
}
|
|
|
|
// IsExist returns a boolean indicating whether the error is known to report
|
|
// that a file or directory already exists. It is satisfied by ErrExist as
|
|
// well as some syscall errors.
|
|
func IsExist(err error) bool {
|
|
return isExist(err)
|
|
}
|
|
|
|
// IsNotExist returns a boolean indicating whether the error is known to
|
|
// report that a file or directory does not exist. It is satisfied by
|
|
// ErrNotExist as well as some syscall errors.
|
|
func IsNotExist(err error) bool {
|
|
return isNotExist(err)
|
|
}
|
|
|
|
// IsPermission returns a boolean indicating whether the error is known to
|
|
// report that permission is denied. It is satisfied by ErrPermission as well
|
|
// as some syscall errors.
|
|
func IsPermission(err error) bool {
|
|
return isPermission(err)
|
|
}
|
|
|
|
// underlyingError returns the underlying error for known os error types.
|
|
func underlyingError(err error) error {
|
|
switch err := err.(type) {
|
|
case *PathError:
|
|
return err.Err
|
|
case *LinkError:
|
|
return err.Err
|
|
case *SyscallError:
|
|
return err.Err
|
|
}
|
|
return err
|
|
}
|