1 /*
2 * Copyright (c) 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 #include "common/napi_helper.cpp"
17 #include "common/native_common.h"
18 #include "napi/native_api.h"
19 #include <cerrno>
20 #include <climits>
21 #include <cstdio>
22 #include <cstdlib>
23 #include <cstring>
24 #include <fcntl.h>
25 #include <ifaddrs.h>
26 #include <js_native_api.h>
27 #include <js_native_api_types.h>
28 #include <net/if.h>
29 #include <node_api.h>
30 #include <sys/inotify.h>
31 #include <sys/random.h>
32 #include <sys/syscall.h>
33 #include <sys/sysinfo.h>
34 #include <unistd.h>
35
36 #define PARAM_0 0
37 #define PARAM_2 2
38 #define MPARAM_1 (-1)
39 #define PARAM_0777 0777
40
41 static const char *g_tempFile = "/data/storage/el2/base/files/fzl.txt";
42 static const char *g_tempFileContent = "This is a test";
43 constexpr int BUF_SIZE = 256;
44 constexpr size_t COUNT = 100;
45
46 extern "C" char *__getcwd_chk(char *, size_t, size_t);
GetcwdChk_One(napi_env env, napi_callback_info info)47 static napi_value GetcwdChk_One(napi_env env, napi_callback_info info)
48 {
49 errno = PARAM_0;
50 char buf[PATH_MAX];
51 char *ret = __getcwd_chk(buf, PATH_MAX, PATH_MAX);
52 napi_value result = nullptr;
53 napi_create_int32(env, errno == PARAM_0 && ret != nullptr, &result);
54 return result;
55 }
56
GetcwdChk_Two(napi_env env, napi_callback_info info)57 static napi_value GetcwdChk_Two(napi_env env, napi_callback_info info)
58 {
59 errno = PARAM_0;
60 char *ret = __getcwd_chk(nullptr, PATH_MAX, PATH_MAX);
61 napi_value result = nullptr;
62 napi_create_int32(env, errno == PARAM_0 && ret != nullptr, &result);
63 return result;
64 }
65
GetcwdChk_Three(napi_env env, napi_callback_info info)66 static napi_value GetcwdChk_Three(napi_env env, napi_callback_info info)
67 {
68 errno = PARAM_0;
69 char buf[5];
70 char *ret = __getcwd_chk(buf, PARAM_0, PARAM_0);
71 napi_value result = nullptr;
72 napi_create_int32(env, errno == EINVAL && ret == nullptr, &result);
73 return result;
74 }
75
76 extern "C" ssize_t __pread_chk(int fd, void *buf, size_t count, off_t offset, size_t buf_size);
PreadChk_One(napi_env env, napi_callback_info info)77 static napi_value PreadChk_One(napi_env env, napi_callback_info info)
78 {
79 char buf[BUF_SIZE];
80 off_t offset = PARAM_0;
81 int fileDescribe = open(g_tempFile, O_CREAT | O_RDWR, PARAM_0777);
82 NAPI_ASSERT(env, fileDescribe != MPARAM_1, "open Error");
83 FILE *fp = fdopen(fileDescribe, "w+");
84 fputs(g_tempFileContent, fp);
85 fflush(fp);
86 size_t ret = __pread_chk(fileDescribe, buf, COUNT, offset, sizeof(buf));
87 fclose(fp);
88 napi_value result = nullptr;
89 napi_create_int32(env, ret == strlen(g_tempFileContent), &result);
90 remove(g_tempFile);
91 return result;
92 }
93
PreadChk_Two(napi_env env, napi_callback_info info)94 static napi_value PreadChk_Two(napi_env env, napi_callback_info info)
95 {
96 char buf[BUF_SIZE];
97 off_t offset = PARAM_0;
98 int ret = __pread_chk(MPARAM_1, buf, COUNT, offset, sizeof(buf));
99 napi_value result = nullptr;
100 napi_create_int32(env, ret == MPARAM_1 && errno == EBADF, &result);
101 return result;
102 }
103
104 extern "C" ssize_t __read_chk(int, void *, size_t, size_t);
ReadChk_One(napi_env env, napi_callback_info info)105 static napi_value ReadChk_One(napi_env env, napi_callback_info info)
106 {
107 char buf[BUF_SIZE];
108 int fileDescribe = open(g_tempFile, O_CREAT | O_RDWR, PARAM_0777);
109 NAPI_ASSERT(env, fileDescribe != MPARAM_1, "open Error");
110 FILE *fp = fdopen(fileDescribe, "w+");
111 fputs(g_tempFileContent, fp);
112 fflush(fp);
113 size_t ret = __read_chk(fileDescribe, buf, BUF_SIZE, sizeof(buf));
114 fclose(fp);
115 napi_value result = nullptr;
116 napi_create_int32(env, ret == strlen(g_tempFileContent), &result);
117 remove(g_tempFile);
118 return result;
119 }
120
ReadChk_Two(napi_env env, napi_callback_info info)121 static napi_value ReadChk_Two(napi_env env, napi_callback_info info)
122 {
123 char buf[BUF_SIZE];
124 int ret = __read_chk(MPARAM_1, buf, BUF_SIZE, sizeof(buf));
125 napi_value result = nullptr;
126 napi_create_int32(env, ret == MPARAM_1 && errno == EBADF, &result);
127 return result;
128 }
129
PWrite_One(napi_env env, napi_callback_info info)130 static napi_value PWrite_One(napi_env env, napi_callback_info info)
131 {
132 int fileDescribe = open(g_tempFile, O_CREAT | O_RDWR, PARAM_0777);
133 NAPI_ASSERT(env, fileDescribe != MPARAM_1, "open Error");
134 size_t ret = pwrite(fileDescribe, g_tempFileContent, strlen(g_tempFileContent), PARAM_0);
135 close(fileDescribe);
136 napi_value result = nullptr;
137 napi_create_int32(env, ret == strlen(g_tempFileContent), &result);
138 remove(g_tempFile);
139 return result;
140 }
141
PWrite_Two(napi_env env, napi_callback_info info)142 static napi_value PWrite_Two(napi_env env, napi_callback_info info)
143 {
144 int ret = pwrite(MPARAM_1, g_tempFileContent, strlen(g_tempFileContent), PARAM_0);
145 napi_value result = nullptr;
146 napi_create_int32(env, ret == MPARAM_1 && errno == EBADF, &result);
147 return result;
148 }
149
PRead64_One(napi_env env, napi_callback_info info)150 static napi_value PRead64_One(napi_env env, napi_callback_info info)
151 {
152 char buf[BUF_SIZE];
153 int fileDescribe = open(g_tempFile, O_CREAT | O_RDWR, PARAM_0777);
154 NAPI_ASSERT(env, fileDescribe != MPARAM_1, "open Error");
155 pwrite(fileDescribe, g_tempFileContent, strlen(g_tempFileContent), PARAM_0);
156 lseek(fileDescribe, PARAM_0, SEEK_SET);
157 size_t ret = pread64(fileDescribe, buf, BUF_SIZE, PARAM_0);
158 close(fileDescribe);
159 napi_value result = nullptr;
160 napi_create_int32(env, ret == strlen(g_tempFileContent), &result);
161 remove(g_tempFile);
162 return result;
163 }
164
PRead64_Two(napi_env env, napi_callback_info info)165 static napi_value PRead64_Two(napi_env env, napi_callback_info info)
166 {
167 char buf[BUF_SIZE];
168 int ret = pread64(MPARAM_1, buf, BUF_SIZE, PARAM_0);
169 napi_value result = nullptr;
170 napi_create_int32(env, ret == MPARAM_1 && errno == EBADF, &result);
171 return result;
172 }
173
PWrite64_One(napi_env env, napi_callback_info info)174 static napi_value PWrite64_One(napi_env env, napi_callback_info info)
175 {
176 int fileDescribe = open(g_tempFile, O_CREAT | O_RDWR, PARAM_0777);
177 NAPI_ASSERT(env, fileDescribe != MPARAM_1, "open Error");
178 size_t ret = pwrite64(fileDescribe, g_tempFileContent, strlen(g_tempFileContent), PARAM_0);
179 close(fileDescribe);
180 napi_value result = nullptr;
181 napi_create_int32(env, ret == strlen(g_tempFileContent), &result);
182 remove(g_tempFile);
183 return result;
184 }
185
PWrite64_Two(napi_env env, napi_callback_info info)186 static napi_value PWrite64_Two(napi_env env, napi_callback_info info)
187 {
188 int ret = pwrite64(MPARAM_1, g_tempFileContent, strlen(g_tempFileContent), PARAM_0);
189 napi_value result = nullptr;
190 napi_create_int32(env, ret == MPARAM_1 && errno == EBADF, &result);
191 return result;
192 }
193
Lseek_One(napi_env env, napi_callback_info info)194 static napi_value Lseek_One(napi_env env, napi_callback_info info)
195 {
196 int seekLen = PARAM_2;
197 int fileDescribe = open(g_tempFile, O_CREAT | O_RDWR, PARAM_0777);
198 NAPI_ASSERT(env, fileDescribe != MPARAM_1, "open Error");
199 pwrite(fileDescribe, g_tempFileContent, strlen(g_tempFileContent), PARAM_0);
200 int ret = lseek(fileDescribe, seekLen, SEEK_SET);
201 close(fileDescribe);
202 napi_value result = nullptr;
203 napi_create_int32(env, ret == seekLen, &result);
204 remove(g_tempFile);
205 return result;
206 }
207
Lseek_Two(napi_env env, napi_callback_info info)208 static napi_value Lseek_Two(napi_env env, napi_callback_info info)
209 {
210 int seekLen = PARAM_2;
211 int ret = lseek(MPARAM_1, seekLen, SEEK_SET);
212 napi_value result = nullptr;
213 napi_create_int32(env, ret == MPARAM_1 && errno == EBADF, &result);
214 return result;
215 }
216
Lseek64_One(napi_env env, napi_callback_info info)217 static napi_value Lseek64_One(napi_env env, napi_callback_info info)
218 {
219 int seekLen = PARAM_2;
220 int fileDescribe = open(g_tempFile, O_CREAT | O_RDWR, PARAM_0777);
221 NAPI_ASSERT(env, fileDescribe != MPARAM_1, "open Error");
222 pwrite(fileDescribe, g_tempFileContent, strlen(g_tempFileContent), PARAM_0);
223 int ret = lseek64(fileDescribe, seekLen, SEEK_SET);
224 close(fileDescribe);
225 napi_value result = nullptr;
226 napi_create_int32(env, ret == seekLen, &result);
227 remove(g_tempFile);
228 return result;
229 }
230
Lseek64_Two(napi_env env, napi_callback_info info)231 static napi_value Lseek64_Two(napi_env env, napi_callback_info info)
232 {
233 int seekLen = PARAM_2;
234 int ret = lseek64(MPARAM_1, seekLen, SEEK_SET);
235 napi_value result = nullptr;
236 napi_create_int32(env, ret == MPARAM_1 && errno == EBADF, &result);
237 return result;
238 }
239
240 EXTERN_C_START
Init(napi_env env, napi_value exports)241 static napi_value Init(napi_env env, napi_value exports)
242 {
243 napi_property_descriptor desc[] = {
244 {"GetcwdChk_One", nullptr, GetcwdChk_One, nullptr, nullptr, nullptr, napi_default, nullptr},
245 {"GetcwdChk_Two", nullptr, GetcwdChk_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
246 {"GetcwdChk_Three", nullptr, GetcwdChk_Three, nullptr, nullptr, nullptr, napi_default, nullptr},
247 {"PreadChk_One", nullptr, PreadChk_One, nullptr, nullptr, nullptr, napi_default, nullptr},
248 {"PreadChk_Two", nullptr, PreadChk_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
249 {"ReadChk_One", nullptr, ReadChk_One, nullptr, nullptr, nullptr, napi_default, nullptr},
250 {"ReadChk_Two", nullptr, ReadChk_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
251 {"PWrite_One", nullptr, PWrite_One, nullptr, nullptr, nullptr, napi_default, nullptr},
252 {"PWrite_Two", nullptr, PWrite_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
253 {"PWrite64_One", nullptr, PWrite64_One, nullptr, nullptr, nullptr, napi_default, nullptr},
254 {"PWrite64_Two", nullptr, PWrite64_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
255 {"PRead64_One", nullptr, PRead64_One, nullptr, nullptr, nullptr, napi_default, nullptr},
256 {"PRead64_Two", nullptr, PRead64_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
257 {"Lseek_One", nullptr, Lseek_One, nullptr, nullptr, nullptr, napi_default, nullptr},
258 {"Lseek_Two", nullptr, Lseek_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
259 {"Lseek64_One", nullptr, Lseek64_One, nullptr, nullptr, nullptr, napi_default, nullptr},
260 {"Lseek64_Two", nullptr, Lseek64_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
261 };
262 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
263 return exports;
264 }
265 EXTERN_C_END
266
267 static napi_module demoModule = {
268 .nm_version = 1,
269 .nm_flags = 0,
270 .nm_filename = nullptr,
271 .nm_register_func = Init,
272 .nm_modname = "libunistdndk1",
273 .nm_priv = ((void *)0),
274 .reserved = {0},
275 };
276
RegisterEntryModule(void)277 extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }