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