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 "napi/native_api.h"
18 #include <cstdio>
19 #include <cstring>
20 #include <fcntl.h>
21 #include <ifaddrs.h>
22 #include <js_native_api_types.h>
23 #include <linux/quota.h>
24 #include <net/if.h>
25 #include <string>
26 #include <sys/inotify.h>
27 #include <sys/stat.h>
28 #include <unistd.h>
29 #include <utmp.h>
30 #include <uv.h>
31
32 #define ONE 1
33 #define TWO 2
34 #define SIZE_2 2
35 #define PATH "/data/storage/el2/base/files"
36 #define PARAM_777 777
37 #define PARAM_0777 0777
38 #define PARAM_0 0
39 #define PARAM_1 1
40 #define PARAM_2 2
41 #define PARAM_UNNORMAL (-1)
42 #define ERRON_0 0
43 #define SUCCESS 1
44 #define SIZE_64 64
45 #define SEC_TIME 123840
46 #define TEST_MODE 0666
47 #define TEST_AT_FDCWD (-100)
48 #define TEST_ERROR_AT_FDCWD 100
49 #define NO_ERR 0
50 #define SUCCESS 1
51 #define FAIL (-1)
52 #define TEN 10
53 #define TEST_FIFO_MODE 0666
54 #define BUFSIZE 128
55
56 extern "C" int __fstat_time64(int, struct stat *);
FStat_time64(napi_env env,napi_callback_info info)57 static napi_value FStat_time64(napi_env env, napi_callback_info info)
58 {
59 struct stat stat {};
60 int ret = __fstat_time64(PARAM_UNNORMAL, &stat);
61 napi_value result = nullptr;
62 napi_create_int32(env, ret, &result);
63 return result;
64 }
65
66 extern "C" int __lstat_time64(const char *__restrict, struct stat *__restrict);
LStat_time64(napi_env env,napi_callback_info info)67 static napi_value LStat_time64(napi_env env, napi_callback_info info)
68 {
69 struct stat stat {};
70 int ret = __lstat_time64("teststat.txt", &stat);
71 napi_value result = nullptr;
72 napi_create_int32(env, ret, &result);
73 return result;
74 }
75
76 extern "C" int __stat_time64(const char *__restrict, struct stat *__restrict);
Stat_time64(napi_env env,napi_callback_info info)77 static napi_value Stat_time64(napi_env env, napi_callback_info info)
78 {
79 struct stat stat {};
80 int ret = __stat_time64("teststat.txt", &stat);
81 napi_value result = nullptr;
82 napi_create_int32(env, ret, &result);
83 return result;
84 }
85
Chmod(napi_env env,napi_callback_info info)86 static napi_value Chmod(napi_env env, napi_callback_info info)
87 {
88 int ret = chmod("teststat.txt", S_IRWXU | S_IRWXG | S_IRWXO);
89 napi_value result;
90 napi_create_int32(env, ret, &result);
91 return result;
92 }
93
Fstatat(napi_env env,napi_callback_info info)94 static napi_value Fstatat(napi_env env, napi_callback_info info)
95 {
96 struct stat st = {PARAM_0};
97 int ret = fstatat(AT_FDCWD, "teststat.txt", &st, PARAM_0);
98 napi_value result;
99 napi_create_int32(env, ret, &result);
100 return result;
101 }
102
Fstatat64(napi_env env,napi_callback_info info)103 static napi_value Fstatat64(napi_env env, napi_callback_info info)
104 {
105 struct stat64 st = {PARAM_0};
106 int ret = fstatat64(AT_FDCWD, "teststat.txt", &st, PARAM_0);
107 napi_value result;
108 napi_create_int32(env, ret, &result);
109 return result;
110 }
111
Lstat(napi_env env,napi_callback_info info)112 static napi_value Lstat(napi_env env, napi_callback_info info)
113 {
114 struct stat statbuff;
115 int32_t ret = lstat("teststat.txt", &statbuff);
116 napi_value result = nullptr;
117 if (ret == FAIL) {
118 napi_create_int32(env, PARAM_UNNORMAL, &result);
119 } else {
120 napi_create_int32(env, PARAM_0, &result);
121 }
122 return result;
123 }
124
Lstat64(napi_env env,napi_callback_info info)125 static napi_value Lstat64(napi_env env, napi_callback_info info)
126 {
127 struct stat64 statbuff;
128 int32_t ret = lstat64("teststat.txt", &statbuff);
129 napi_value result = nullptr;
130 if (ret == FAIL) {
131 napi_create_int32(env, PARAM_UNNORMAL, &result);
132 } else {
133 napi_create_int32(env, PARAM_0, &result);
134 }
135 return result;
136 }
137
Futimens(napi_env env,napi_callback_info info)138 static napi_value Futimens(napi_env env, napi_callback_info info)
139 {
140 int ret = futimens(PARAM_UNNORMAL, ((struct timespec[2]){{.tv_nsec = UTIME_NOW}, {.tv_nsec = UTIME_NOW}}));
141 napi_value result;
142 napi_create_int32(env, ret, &result);
143 return result;
144 }
145
Umask(napi_env env,napi_callback_info info)146 static napi_value Umask(napi_env env, napi_callback_info info)
147 {
148 mode_t mode = FAIL;
149 mode_t ret = umask(mode);
150 ret = umask(ret);
151 napi_value result = nullptr;
152 if (ret != mode) {
153 napi_create_int32(env, FAIL, &result);
154 } else {
155 napi_create_int32(env, PARAM_0, &result);
156 }
157 return result;
158 }
159
160 EXTERN_C_START
Init(napi_env env,napi_value exports)161 static napi_value Init(napi_env env, napi_value exports)
162 {
163 napi_property_descriptor desc[] = {
164 {"__fstat_time64", nullptr, FStat_time64, nullptr, nullptr, nullptr, napi_default, nullptr},
165 {"__lstat_time64", nullptr, LStat_time64, nullptr, nullptr, nullptr, napi_default, nullptr},
166 {"__stat_time64", nullptr, Stat_time64, nullptr, nullptr, nullptr, napi_default, nullptr},
167 {"chmod", nullptr, Chmod, nullptr, nullptr, nullptr, napi_default, nullptr},
168 {"fstatat", nullptr, Fstatat, nullptr, nullptr, nullptr, napi_default, nullptr},
169 {"fstatat64", nullptr, Fstatat64, nullptr, nullptr, nullptr, napi_default, nullptr},
170 {"lstat", nullptr, Lstat, nullptr, nullptr, nullptr, napi_default, nullptr},
171 {"lstat64", nullptr, Lstat64, nullptr, nullptr, nullptr, napi_default, nullptr},
172 {"futimens", nullptr, Futimens, nullptr, nullptr, nullptr, napi_default, nullptr},
173 {"umask", nullptr, Umask, nullptr, nullptr, nullptr, napi_default, nullptr}};
174 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
175 return exports;
176 }
177 EXTERN_C_END
178
179 static napi_module demoModule = {
180 .nm_version = 1,
181 .nm_flags = 0,
182 .nm_filename = nullptr,
183 .nm_register_func = Init,
184 .nm_modname = "stat1",
185 .nm_priv = ((void *)0),
186 .reserved = {0},
187 };
188
RegisterModule(void)189 extern "C" __attribute__((constructor)) void RegisterModule(void) { napi_module_register(&demoModule); }
190