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