Home | History | Annotate | Download | only in os
      1 // Copyright 2009 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package os
      6 
      7 import (
      8 	"errors"
      9 )
     10 
     11 // Portable analogs of some common system call errors.
     12 var (
     13 	ErrInvalid    = errors.New("invalid argument") // methods on File will return this error when the receiver is nil
     14 	ErrPermission = errors.New("permission denied")
     15 	ErrExist      = errors.New("file already exists")
     16 	ErrNotExist   = errors.New("file does not exist")
     17 	ErrClosed     = errors.New("file already closed")
     18 )
     19 
     20 // PathError records an error and the operation and file path that caused it.
     21 type PathError struct {
     22 	Op   string
     23 	Path string
     24 	Err  error
     25 }
     26 
     27 func (e *PathError) Error() string { return e.Op + " " + e.Path + ": " + e.Err.Error() }
     28 
     29 // SyscallError records an error from a specific system call.
     30 type SyscallError struct {
     31 	Syscall string
     32 	Err     error
     33 }
     34 
     35 func (e *SyscallError) Error() string { return e.Syscall + ": " + e.Err.Error() }
     36 
     37 // NewSyscallError returns, as an error, a new SyscallError
     38 // with the given system call name and error details.
     39 // As a convenience, if err is nil, NewSyscallError returns nil.
     40 func NewSyscallError(syscall string, err error) error {
     41 	if err == nil {
     42 		return nil
     43 	}
     44 	return &SyscallError{syscall, err}
     45 }
     46 
     47 // IsExist returns a boolean indicating whether the error is known to report
     48 // that a file or directory already exists. It is satisfied by ErrExist as
     49 // well as some syscall errors.
     50 func IsExist(err error) bool {
     51 	return isExist(err)
     52 }
     53 
     54 // IsNotExist returns a boolean indicating whether the error is known to
     55 // report that a file or directory does not exist. It is satisfied by
     56 // ErrNotExist as well as some syscall errors.
     57 func IsNotExist(err error) bool {
     58 	return isNotExist(err)
     59 }
     60 
     61 // IsPermission returns a boolean indicating whether the error is known to
     62 // report that permission is denied. It is satisfied by ErrPermission as well
     63 // as some syscall errors.
     64 func IsPermission(err error) bool {
     65 	return isPermission(err)
     66 }
     67 
     68 // underlyingError returns the underlying error for known os error types.
     69 func underlyingError(err error) error {
     70 	switch err := err.(type) {
     71 	case *PathError:
     72 		return err.Err
     73 	case *LinkError:
     74 		return err.Err
     75 	case *SyscallError:
     76 		return err.Err
     77 	}
     78 	return err
     79 }
     80