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 }