• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 newLimit = {0};
186     struct rlimit oldLimit = {0};
187     ret = prlimit(pid, RLIMIT_STACK, nullptr, &newLimit);
188     newLimit.rlim_cur = lim;
189     ret += prlimit(pid, RLIMIT_STACK, &newLimit, &oldLimit);
190     ret += prlimit(pid, RLIMIT_STACK, &oldLimit, nullptr);
191 
192     napi_value result = nullptr;
193     napi_create_int32(env, ret, &result);
194     return result;
195 }
PrLimit2(napi_env env,napi_callback_info info)196 static napi_value PrLimit2(napi_env env, napi_callback_info info)
197 {
198     int ret;
199     id_t pid = getpid();
200     static const unsigned long long lim = PARAM_4;
201     struct rlimit limit = {.rlim_cur = lim, .rlim_max = lim};
202     ret = prlimit(pid, MINUSONE, &limit, nullptr);
203 
204     napi_value result = nullptr;
205     napi_create_int32(env, ret, &result);
206     return result;
207 }
PrLimit641(napi_env env,napi_callback_info info)208 static napi_value PrLimit641(napi_env env, napi_callback_info info)
209 {
210     int ret;
211     id_t pid = getpid();
212     static const unsigned long long lim = PARAM_4;
213     struct rlimit newLimit = {0};
214     struct rlimit oldLimit = {0};
215     ret = prlimit64(pid, RLIMIT_STACK, nullptr, &newLimit);
216     newLimit.rlim_cur = lim;
217     ret += prlimit64(pid, RLIMIT_STACK, &newLimit, &oldLimit);
218     ret += prlimit64(pid, RLIMIT_STACK, &oldLimit, nullptr);
219 
220     napi_value result = nullptr;
221     napi_create_int32(env, ret, &result);
222     return result;
223 }
PrLimit642(napi_env env,napi_callback_info info)224 static napi_value PrLimit642(napi_env env, napi_callback_info info)
225 {
226     int ret;
227     id_t pid = getpid();
228     static const unsigned long long lim = PARAM_4;
229     struct rlimit64 limit = {.rlim_cur = lim, .rlim_max = lim};
230     ret = prlimit64(pid, MINUSONE, &limit, nullptr);
231 
232     napi_value result = nullptr;
233     napi_create_int32(env, ret, &result);
234     return result;
235 }
236 
237 EXTERN_C_START
Init(napi_env env,napi_value exports)238 static napi_value Init(napi_env env, napi_value exports)
239 {
240     napi_property_descriptor desc[] = {
241         {"getPriority1", nullptr, GetPriority1, nullptr, nullptr, nullptr, napi_default, nullptr},
242         {"getPriority2", nullptr, GetPriority2, nullptr, nullptr, nullptr, napi_default, nullptr},
243         {"setpriority1", nullptr, Setpriority1, nullptr, nullptr, nullptr, napi_default, nullptr},
244         {"setpriority2", nullptr, Setpriority2, nullptr, nullptr, nullptr, napi_default, nullptr},
245         {"getRLimit1", nullptr, GetRLimit1, nullptr, nullptr, nullptr, napi_default, nullptr},
246         {"getRLimit2", nullptr, GetRLimit2, nullptr, nullptr, nullptr, napi_default, nullptr},
247         {"setrlimit1", nullptr, Setrlimit1, nullptr, nullptr, nullptr, napi_default, nullptr},
248         {"setrlimit2", nullptr, Setrlimit2, nullptr, nullptr, nullptr, napi_default, nullptr},
249         {"getrlimit641", nullptr, Getrlimit641, nullptr, nullptr, nullptr, napi_default, nullptr},
250         {"getrlimit642", nullptr, Getrlimit642, nullptr, nullptr, nullptr, napi_default, nullptr},
251         {"getRUsage1", nullptr, GetRUsage1, nullptr, nullptr, nullptr, napi_default, nullptr},
252         {"getRUsage2", nullptr, GetRUsage2, nullptr, nullptr, nullptr, napi_default, nullptr},
253         {"setrlimit641", nullptr, Setrlimit641, nullptr, nullptr, nullptr, napi_default, nullptr},
254         {"setrlimit642", nullptr, Setrlimit642, nullptr, nullptr, nullptr, napi_default, nullptr},
255         {"prLimit1", nullptr, PrLimit1, nullptr, nullptr, nullptr, napi_default, nullptr},
256         {"prLimit2", nullptr, PrLimit2, nullptr, nullptr, nullptr, napi_default, nullptr},
257         {"prLimit641", nullptr, PrLimit641, nullptr, nullptr, nullptr, napi_default, nullptr},
258         {"prLimit642", nullptr, PrLimit642, nullptr, nullptr, nullptr, napi_default, nullptr},
259     };
260     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
261     return exports;
262 }
263 EXTERN_C_END
264 
265 static napi_module demoModule = {
266     .nm_version = 1,
267     .nm_flags = 0,
268     .nm_filename = "resourcendk1",
269     .nm_register_func = Init,
270     .nm_modname = "libresourcendk1",
271     .nm_priv = ((void *)0),
272     .reserved = {0},
273 };
274 
RegisterModule(void)275 extern "C" __attribute__((constructor)) void RegisterModule(void) { napi_module_register(&demoModule); }
276