storj.io/minio@v0.0.0-20230509071714-0cbc90f649b1/cmd/xl-storage-errors.go (about)

     1  /*
     2   * MinIO Cloud Storage, (C) 2016-2020 MinIO, Inc.
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *     http://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  package cmd
    18  
    19  import (
    20  	"errors"
    21  	"os"
    22  	"runtime"
    23  	"syscall"
    24  )
    25  
    26  // Function not implemented error
    27  func isSysErrNoSys(err error) bool {
    28  	return errors.Is(err, syscall.ENOSYS)
    29  }
    30  
    31  // Not supported error
    32  func isSysErrOpNotSupported(err error) bool {
    33  	return errors.Is(err, syscall.EOPNOTSUPP)
    34  }
    35  
    36  // No space left on device error
    37  func isSysErrNoSpace(err error) bool {
    38  	return errors.Is(err, syscall.ENOSPC)
    39  }
    40  
    41  // Invalid argument, unsupported flags such as O_DIRECT
    42  func isSysErrInvalidArg(err error) bool {
    43  	return errors.Is(err, syscall.EINVAL)
    44  }
    45  
    46  // Input/output error
    47  func isSysErrIO(err error) bool {
    48  	return errors.Is(err, syscall.EIO)
    49  }
    50  
    51  // Check if the given error corresponds to EISDIR (is a directory).
    52  func isSysErrIsDir(err error) bool {
    53  	return errors.Is(err, syscall.EISDIR)
    54  }
    55  
    56  // Check if the given error corresponds to ENOTDIR (is not a directory).
    57  func isSysErrNotDir(err error) bool {
    58  	return errors.Is(err, syscall.ENOTDIR)
    59  }
    60  
    61  // Check if the given error corresponds to the ENAMETOOLONG (name too long).
    62  func isSysErrTooLong(err error) bool {
    63  	return errors.Is(err, syscall.ENAMETOOLONG)
    64  }
    65  
    66  // Check if the given error corresponds to the ELOOP (too many symlinks).
    67  func isSysErrTooManySymlinks(err error) bool {
    68  	return errors.Is(err, syscall.ELOOP)
    69  }
    70  
    71  // Check if the given error corresponds to ENOTEMPTY for unix,
    72  // EEXIST for solaris variants,
    73  // and ERROR_DIR_NOT_EMPTY for windows (directory not empty).
    74  func isSysErrNotEmpty(err error) bool {
    75  	if errors.Is(err, syscall.ENOTEMPTY) {
    76  		return true
    77  	}
    78  	if errors.Is(err, syscall.EEXIST) && runtime.GOOS == "solaris" {
    79  		return true
    80  	}
    81  	var pathErr *os.PathError
    82  	if errors.As(err, &pathErr) {
    83  		if runtime.GOOS == globalWindowsOSName {
    84  			var errno syscall.Errno
    85  			if errors.As(pathErr.Err, &errno) {
    86  				// ERROR_DIR_NOT_EMPTY
    87  				return errno == 0x91
    88  			}
    89  		}
    90  	}
    91  	return false
    92  }
    93  
    94  // Check if the given error corresponds to the specific ERROR_PATH_NOT_FOUND for windows
    95  func isSysErrPathNotFound(err error) bool {
    96  	if runtime.GOOS != globalWindowsOSName {
    97  		var pathErr *os.PathError
    98  		if errors.As(err, &pathErr) {
    99  			return pathErr.Err == syscall.ENOENT
   100  		}
   101  		return false
   102  	}
   103  	var pathErr *os.PathError
   104  	if errors.As(err, &pathErr) {
   105  		var errno syscall.Errno
   106  		if errors.As(pathErr.Err, &errno) {
   107  			// ERROR_PATH_NOT_FOUND
   108  			return errno == 0x03
   109  		}
   110  	}
   111  	return false
   112  }
   113  
   114  // Check if the given error corresponds to the specific ERROR_INVALID_HANDLE for windows
   115  func isSysErrHandleInvalid(err error) bool {
   116  	if runtime.GOOS != globalWindowsOSName {
   117  		return false
   118  	}
   119  	// Check if err contains ERROR_INVALID_HANDLE errno
   120  	var pathErr *os.PathError
   121  	if errors.As(err, &pathErr) {
   122  		var errno syscall.Errno
   123  		if errors.As(pathErr.Err, &errno) {
   124  			// ERROR_PATH_NOT_FOUND
   125  			return errno == 0x6
   126  		}
   127  	}
   128  	return false
   129  }
   130  
   131  func isSysErrCrossDevice(err error) bool {
   132  	return errors.Is(err, syscall.EXDEV)
   133  }
   134  
   135  // Check if given error corresponds to too many open files
   136  func isSysErrTooManyFiles(err error) bool {
   137  	return errors.Is(err, syscall.ENFILE) || errors.Is(err, syscall.EMFILE)
   138  }
   139  
   140  func osIsNotExist(err error) bool {
   141  	return errors.Is(err, os.ErrNotExist)
   142  }
   143  
   144  func osIsPermission(err error) bool {
   145  	return errors.Is(err, os.ErrPermission)
   146  }
   147  
   148  func osIsExist(err error) bool {
   149  	return errors.Is(err, os.ErrExist)
   150  }