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); }