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 <cstdlib>
21 #include <cstring>
22 #include <ifaddrs.h>
23 #include <js_native_api_types.h>
24 #include <net/if.h>
25 #include <sys/inotify.h>
26 #include <sys/resource.h>
27 #include <unistd.h>
28 #include <utmp.h>
29 #include <uv.h>
30
31 #define NO_ERR 0
32 #define SUCCESS 1
33 #define FAIL (-1)
34 #define TRUE 1
35 #define LENGTH 1
36 #define ONE 1
37 #define PARAM_0 0
38 #define PARAM_1 1
39 #define PARAM_4 4
40 #define PARAM_100 100
41 #define ONEVAL 1
42 #define MINUSONE (-1)
43 #define MINUSTWO (-2)
44 #define MINUSTHR (-3)
45 #define FOURTWO 42
46 #define SIZE_1024 1024
47
GetPriority1(napi_env env, napi_callback_info info)48 static napi_value GetPriority1(napi_env env, napi_callback_info info)
49 {
50 int ret;
51 errno = NO_ERR;
52 id_t pid = getpid();
53 ret = getpriority(PRIO_PROCESS, pid);
54
55 napi_value result = nullptr;
56 if (ret == MINUSONE && errno != NO_ERR) {
57 napi_create_int32(env, FAIL, &result);
58 } else {
59 napi_create_int32(env, NO_ERR, &result);
60 }
61 return result;
62 }
GetPriority2(napi_env env, napi_callback_info info)63 static napi_value GetPriority2(napi_env env, napi_callback_info info)
64 {
65 errno = NO_ERR;
66 int ret = getpriority(PRIO_PROCESS, MINUSONE);
67 napi_value result = nullptr;
68 if (ret == MINUSONE && errno != NO_ERR) {
69 napi_create_int32(env, FAIL, &result);
70 } else {
71 napi_create_int32(env, NO_ERR, &result);
72 }
73 return result;
74 }
Setpriority1(napi_env env, napi_callback_info info)75 static napi_value Setpriority1(napi_env env, napi_callback_info info)
76 {
77 id_t pid = getpid();
78 int ret = setpriority(PRIO_PROCESS, pid, ONE);
79 napi_value result = nullptr;
80 napi_create_int32(env, ret, &result);
81 return result;
82 }
Setpriority2(napi_env env, napi_callback_info info)83 static napi_value Setpriority2(napi_env env, napi_callback_info info)
84 {
85 int ret = setpriority(PRIO_PROCESS, MINUSONE, ONE);
86 napi_value result = nullptr;
87 napi_create_int32(env, ret, &result);
88 return result;
89 }
GetRLimit1(napi_env env, napi_callback_info info)90 static napi_value GetRLimit1(napi_env env, napi_callback_info info)
91 {
92 struct rlimit limit;
93 int ret = getrlimit(RLIMIT_FSIZE, &limit);
94 napi_value result = nullptr;
95 napi_create_int32(env, ret, &result);
96 return result;
97 }
GetRLimit2(napi_env env, napi_callback_info info)98 static napi_value GetRLimit2(napi_env env, napi_callback_info info)
99 {
100 struct rlimit limit;
101 int ret = getrlimit(MINUSONE, &limit);
102 napi_value result = nullptr;
103 napi_create_int32(env, ret, &result);
104 return result;
105 }
Setrlimit1(napi_env env, napi_callback_info info)106 static napi_value Setrlimit1(napi_env env, napi_callback_info info)
107 {
108 struct rlimit limit;
109 getrlimit(PRIO_PROCESS, &limit);
110 int ret = setrlimit(PRIO_PROCESS, &limit);
111 napi_value result = nullptr;
112 napi_create_int32(env, ret, &result);
113 return result;
114 }
Setrlimit2(napi_env env, napi_callback_info info)115 static napi_value Setrlimit2(napi_env env, napi_callback_info info)
116 {
117 struct rlimit limit;
118 limit.rlim_cur = PARAM_4;
119 limit.rlim_max = PARAM_1;
120 int ret = setrlimit(PRIO_PROCESS, &limit);
121 napi_value result = nullptr;
122 napi_create_int32(env, ret, &result);
123 return result;
124 }
Getrlimit641(napi_env env, napi_callback_info info)125 static napi_value Getrlimit641(napi_env env, napi_callback_info info)
126 {
127 int ret;
128 struct rlimit64 limit;
129 ret = getrlimit64(RLIMIT_FSIZE, &limit);
130
131 napi_value result = nullptr;
132 napi_create_int32(env, ret, &result);
133 return result;
134 }
Getrlimit642(napi_env env, napi_callback_info info)135 static napi_value Getrlimit642(napi_env env, napi_callback_info info)
136 {
137 struct rlimit64 limit;
138 int ret = getrlimit64(MINUSONE, &limit);
139 napi_value result = nullptr;
140 napi_create_int32(env, ret, &result);
141 return result;
142 }
GetRUsage1(napi_env env, napi_callback_info info)143 static napi_value GetRUsage1(napi_env env, napi_callback_info info)
144 {
145 struct rusage usage;
146 int ret = getrusage(RUSAGE_SELF, &usage);
147 napi_value result = nullptr;
148 napi_create_int32(env, ret, &result);
149 return result;
150 }
GetRUsage2(napi_env env, napi_callback_info info)151 static napi_value GetRUsage2(napi_env env, napi_callback_info info)
152 {
153 struct rusage usage;
154 int ret = getrusage(PARAM_100, &usage);
155 napi_value result = nullptr;
156 napi_create_int32(env, ret, &result);
157 return result;
158 }
Setrlimit641(napi_env env, napi_callback_info info)159 static napi_value Setrlimit641(napi_env env, napi_callback_info info)
160 {
161 struct rlimit64 limit;
162 getrlimit64(PRIO_PROCESS, &limit);
163 int ret = setrlimit64(PRIO_PROCESS, &limit);
164 napi_value result = nullptr;
165 napi_create_int32(env, ret, &result);
166 return result;
167 }
Setrlimit642(napi_env env, napi_callback_info info)168 static napi_value Setrlimit642(napi_env env, napi_callback_info info)
169 {
170 int ret;
171 struct rlimit64 limit;
172 limit.rlim_cur = PARAM_4;
173 limit.rlim_max = PARAM_1;
174 ret = setrlimit64(PRIO_PROCESS, &limit);
175
176 napi_value result = nullptr;
177 napi_create_int32(env, ret, &result);
178 return result;
179 }
PrLimit1(napi_env env, napi_callback_info info)180 static napi_value PrLimit1(napi_env env, napi_callback_info info)
181 {
182 int ret;
183 id_t pid = getpid();
184 static const unsigned long long lim = PARAM_4;
185 struct rlimit limit = {.rlim_cur = lim, .rlim_max = lim};
186 ret = prlimit(pid, RLIMIT_STACK, &limit, nullptr);
187
188 napi_value result = nullptr;
189 napi_create_int32(env, ret, &result);
190 return result;
191 }
PrLimit2(napi_env env, napi_callback_info info)192 static napi_value PrLimit2(napi_env env, napi_callback_info info)
193 {
194 int ret;
195 id_t pid = getpid();
196 static const unsigned long long lim = PARAM_4;
197 struct rlimit limit = {.rlim_cur = lim, .rlim_max = lim};
198 ret = prlimit(pid, MINUSONE, &limit, nullptr);
199
200 napi_value result = nullptr;
201 napi_create_int32(env, ret, &result);
202 return result;
203 }
PrLimit641(napi_env env, napi_callback_info info)204 static napi_value PrLimit641(napi_env env, napi_callback_info info)
205 {
206 int ret;
207 id_t pid = getpid();
208 static const unsigned long long lim = PARAM_4;
209 struct rlimit64 limit = {.rlim_cur = lim, .rlim_max = lim};
210 ret = prlimit64(pid, RLIMIT_STACK, &limit, nullptr);
211
212 napi_value result = nullptr;
213 napi_create_int32(env, ret, &result);
214 return result;
215 }
PrLimit642(napi_env env, napi_callback_info info)216 static napi_value PrLimit642(napi_env env, napi_callback_info info)
217 {
218 int ret;
219 id_t pid = getpid();
220 static const unsigned long long lim = PARAM_4;
221 struct rlimit64 limit = {.rlim_cur = lim, .rlim_max = lim};
222 ret = prlimit64(pid, MINUSONE, &limit, nullptr);
223
224 napi_value result = nullptr;
225 napi_create_int32(env, ret, &result);
226 return result;
227 }
228
229 EXTERN_C_START
Init(napi_env env, napi_value exports)230 static napi_value Init(napi_env env, napi_value exports)
231 {
232 napi_property_descriptor desc[] = {
233 {"getPriority1", nullptr, GetPriority1, nullptr, nullptr, nullptr, napi_default, nullptr},
234 {"getPriority2", nullptr, GetPriority2, nullptr, nullptr, nullptr, napi_default, nullptr},
235 {"setpriority1", nullptr, Setpriority1, nullptr, nullptr, nullptr, napi_default, nullptr},
236 {"setpriority2", nullptr, Setpriority2, nullptr, nullptr, nullptr, napi_default, nullptr},
237 {"getRLimit1", nullptr, GetRLimit1, nullptr, nullptr, nullptr, napi_default, nullptr},
238 {"getRLimit2", nullptr, GetRLimit2, nullptr, nullptr, nullptr, napi_default, nullptr},
239 {"setrlimit1", nullptr, Setrlimit1, nullptr, nullptr, nullptr, napi_default, nullptr},
240 {"setrlimit2", nullptr, Setrlimit2, nullptr, nullptr, nullptr, napi_default, nullptr},
241 {"getrlimit641", nullptr, Getrlimit641, nullptr, nullptr, nullptr, napi_default, nullptr},
242 {"getrlimit642", nullptr, Getrlimit642, nullptr, nullptr, nullptr, napi_default, nullptr},
243 {"getRUsage1", nullptr, GetRUsage1, nullptr, nullptr, nullptr, napi_default, nullptr},
244 {"getRUsage2", nullptr, GetRUsage2, nullptr, nullptr, nullptr, napi_default, nullptr},
245 {"setrlimit641", nullptr, Setrlimit641, nullptr, nullptr, nullptr, napi_default, nullptr},
246 {"setrlimit642", nullptr, Setrlimit642, nullptr, nullptr, nullptr, napi_default, nullptr},
247 {"prLimit1", nullptr, PrLimit1, nullptr, nullptr, nullptr, napi_default, nullptr},
248 {"prLimit2", nullptr, PrLimit2, nullptr, nullptr, nullptr, napi_default, nullptr},
249 {"prLimit641", nullptr, PrLimit641, nullptr, nullptr, nullptr, napi_default, nullptr},
250 {"prLimit642", nullptr, PrLimit642, nullptr, nullptr, nullptr, napi_default, nullptr},
251 };
252 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
253 return exports;
254 }
255 EXTERN_C_END
256
257 static napi_module demoModule = {
258 .nm_version = 1,
259 .nm_flags = 0,
260 .nm_filename = "resourcendk1",
261 .nm_register_func = Init,
262 .nm_modname = "libresourcendk1",
263 .nm_priv = ((void *)0),
264 .reserved = {0},
265 };
266
RegisterModule(void)267 extern "C" __attribute__((constructor)) void RegisterModule(void) { napi_module_register(&demoModule); }
268