1 /* 2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef INTERFACES_KITS_JS_SRC_COMMON_UNI_ERROR_H 17 #define INTERFACES_KITS_JS_SRC_COMMON_UNI_ERROR_H 18 19 #include <string> 20 #include <unordered_map> 21 22 #include "napi/uni_header.h" 23 24 namespace OHOS { 25 namespace DistributedFS { 26 constexpr int ERRNO_NOERR = 0; 27 constexpr int FILEIO_SYS_CAP_TAG = 13900000; 28 const std::string FILEIO_TAG_ERR_CODE = "code"; 29 const std::string FILEIO_TAG_ERR_MSG = "message"; 30 31 enum ELegacy { 32 ELEGACY_INVAL = 202, 33 ELEGACY_IO = 300, 34 ELEGACY_NOENT = 301, 35 }; 36 37 enum ErrCodeSystem { 38 ERR_CODE_SYSTEM_LEGACY, 39 ERR_CODE_SYSTEM_POSIX, 40 }; 41 42 enum ErrCodeSuffix { 43 E_PERM = 1, 44 E_NOENT, 45 E_SRCH, 46 E_INTR, 47 E_IO, 48 E_NXIO, 49 E_2BIG, 50 E_BADF, 51 E_CHILD, 52 E_AGAIN, 53 E_NOMEM, 54 E_ACCES, 55 E_FAULT, 56 E_BUSY, 57 E_EXIST, 58 E_XDEV, 59 E_NODEV, 60 E_NOTDIR, 61 E_ISDIR, 62 E_INVAL, 63 E_NFILE, 64 E_MFILE, 65 E_TXTBSY, 66 E_FBIG, 67 E_NOSPC, 68 E_SPIPE, 69 E_ROFS, 70 E_MLINK, 71 E_DEADLK, 72 E_NAMETOOLONG, 73 E_NOSYS, 74 E_NOTEMPTY, 75 E_LOOP, 76 E_WOULDBLOCK, 77 E_BADR, 78 E_NOSTR, 79 E_NODATA, 80 E_OVERFLOW, 81 E_BADFD, 82 E_RESTART, 83 E_DQUOT, 84 E_UKERR 85 }; 86 87 const std::unordered_map<int, std::pair<int32_t, std::string>> errCodeTable { 88 { EPERM, { FILEIO_SYS_CAP_TAG + E_PERM, "Operation not permitted" } }, 89 { ENOENT, { FILEIO_SYS_CAP_TAG + E_NOENT, "No such file or directory" } }, 90 { ESRCH, { FILEIO_SYS_CAP_TAG + E_SRCH, "No such process" } }, 91 { EINTR, { FILEIO_SYS_CAP_TAG + E_INTR, "Interrupted system call" } }, 92 { EIO, { FILEIO_SYS_CAP_TAG + E_IO, "I/O error" } }, 93 { ENXIO, { FILEIO_SYS_CAP_TAG + E_NXIO, "No such device or address" } }, 94 { E2BIG, { FILEIO_SYS_CAP_TAG + E_2BIG, "Arg list too long" } }, 95 { EBADF, { FILEIO_SYS_CAP_TAG + E_BADF, "Bad file descriptor" } }, 96 { ECHILD, { FILEIO_SYS_CAP_TAG + E_CHILD, "No child processes" } }, 97 { EAGAIN, { FILEIO_SYS_CAP_TAG + E_AGAIN, "Try again" } }, 98 { ENOMEM, { FILEIO_SYS_CAP_TAG + E_NOMEM, "Out of memory" } }, 99 { EACCES, { FILEIO_SYS_CAP_TAG + E_ACCES, "Permission denied" } }, 100 { EFAULT, { FILEIO_SYS_CAP_TAG + E_FAULT, "Bad address" } }, 101 { EBUSY, { FILEIO_SYS_CAP_TAG + E_BUSY, "Device or resource busy" } }, 102 { EEXIST, { FILEIO_SYS_CAP_TAG + E_EXIST, "File exists" } }, 103 { EXDEV, { FILEIO_SYS_CAP_TAG + E_XDEV, "Cross-device link" } }, 104 { ENODEV, { FILEIO_SYS_CAP_TAG + E_NODEV, "No such device" } }, 105 { ENOTDIR, { FILEIO_SYS_CAP_TAG + E_NOTDIR, "Not a directory" } }, 106 { EISDIR, { FILEIO_SYS_CAP_TAG + E_ISDIR, "Is a directory" } }, 107 { EINVAL, { FILEIO_SYS_CAP_TAG + E_INVAL, "Invalid argument" } }, 108 { ENFILE, { FILEIO_SYS_CAP_TAG + E_NFILE, "File table overflow" } }, 109 { EMFILE, { FILEIO_SYS_CAP_TAG + E_MFILE, "Too many open files" } }, 110 { ETXTBSY, { FILEIO_SYS_CAP_TAG + E_TXTBSY, "Text file busy" } }, 111 { EFBIG, { FILEIO_SYS_CAP_TAG + E_FBIG, "File too large" } }, 112 { ENOSPC, { FILEIO_SYS_CAP_TAG + E_NOSPC, "No space left on device" } }, 113 { ESPIPE, { FILEIO_SYS_CAP_TAG + E_SPIPE, "Illegal seek" } }, 114 { EROFS, { FILEIO_SYS_CAP_TAG + E_ROFS, "Read-only file system" } }, 115 { EMLINK, { FILEIO_SYS_CAP_TAG + E_MLINK, "Too many links" } }, 116 { EDEADLK, { FILEIO_SYS_CAP_TAG + E_DEADLK, "Resource deadlock would occur" } }, 117 { ENAMETOOLONG, { FILEIO_SYS_CAP_TAG + E_NAMETOOLONG, "File name too long" } }, 118 { ENOSYS, { FILEIO_SYS_CAP_TAG + E_NOSYS, "Function not implemented" } }, 119 { ENOTEMPTY, { FILEIO_SYS_CAP_TAG + E_NOTEMPTY, "Directory not empty" } }, 120 { ELOOP, { FILEIO_SYS_CAP_TAG + E_LOOP, "Too many symbolic links encountered" } }, 121 { EWOULDBLOCK, { FILEIO_SYS_CAP_TAG + E_WOULDBLOCK, "Operation would block" } }, 122 { EBADR, { FILEIO_SYS_CAP_TAG + E_BADR, "Invalid request descriptor" } }, 123 { ENOSTR, { FILEIO_SYS_CAP_TAG + E_NOSTR, "Device not a stream" } }, 124 { ENODATA, { FILEIO_SYS_CAP_TAG + E_NODATA, "No data available" } }, 125 { EOVERFLOW, { FILEIO_SYS_CAP_TAG + E_OVERFLOW, "Value too large for defined data type" } }, 126 { EBADFD, { FILEIO_SYS_CAP_TAG + E_BADFD, "File descriptor in bad state" } }, 127 { ERESTART, { FILEIO_SYS_CAP_TAG + E_RESTART, "Interrupted system call should be restarted" } }, 128 { EDQUOT, { FILEIO_SYS_CAP_TAG + E_DQUOT, "Quota exceeded" } }, 129 { -1, { FILEIO_SYS_CAP_TAG + E_UKERR, "Unknown error" } } 130 }; 131 132 class UniError { 133 public: 134 UniError(); 135 explicit UniError(ELegacy eLegacy); 136 explicit UniError(int ePosix); 137 explicit UniError(int ePosix, bool throwCode); 138 UniError(const UniError &) = default; 139 ~UniError() = default; 140 141 UniError &operator = (const UniError &) = default; 142 143 explicit operator bool() const; 144 145 void SetErrno(ELegacy eLegacy); 146 void SetErrno(int ePosix); 147 int GetErrno(ErrCodeSystem cs); 148 149 std::string GetDefaultErrstr(); 150 napi_value GetNapiErr(napi_env env); 151 napi_value GetNapiErr(napi_env env, std::string errMsg); 152 void ThrowErr(napi_env env); 153 void ThrowErr(napi_env env, int code); 154 void ThrowErr(napi_env env, std::string errMsg); 155 156 private: 157 int errno_ = ERRNO_NOERR; 158 ErrCodeSystem codingSystem_ = ERR_CODE_SYSTEM_POSIX; 159 bool throwCode_ = false; 160 }; 161 } // namespace DistributedFS 162 } // namespace OHOS 163 #endif // INTERFACES_KITS_JS_SRC_COMMON_UNI_ERROR_H