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 <cerrno>
17 #include <dirent.h>
18 #include <fcntl.h>
19 #include <js_native_api.h>
20 #include <js_native_api_types.h>
21 #include <node_api.h>
22 #include <spawn.h>
23 #include <sys/stat.h>
24 #include <unistd.h>
25
26 #define FAIL 0
27 #define SUCCESS 1
28 #define PARAM_0 0
29 #define PARAM_0777 0777
30
PosixSpawnAttrGetflags(napi_env env, napi_callback_info info)31 static napi_value PosixSpawnAttrGetflags(napi_env env, napi_callback_info info)
32 {
33 posix_spawnattr_t attr;
34 posix_spawnattr_init(&attr);
35 short flags = PARAM_0;
36 int resultinfo = posix_spawnattr_getflags(&attr, &flags);
37 napi_value result = nullptr;
38 napi_create_int32(env, resultinfo, &result);
39 return result;
40 }
41
PosixSpawnFileActionsAddclose(napi_env env, napi_callback_info info)42 static napi_value PosixSpawnFileActionsAddclose(napi_env env, napi_callback_info info)
43 {
44 posix_spawn_file_actions_t param;
45 posix_spawn_file_actions_init(¶m);
46 int ret = posix_spawn_file_actions_addclose(¶m, SUCCESS);
47 napi_value result = nullptr;
48 napi_create_int32(env, ret, &result);
49 return result;
50 }
51
PosixSpawn(napi_env env, napi_callback_info info)52 static napi_value PosixSpawn(napi_env env, napi_callback_info info)
53 {
54 pid_t Pid = PARAM_0;
55 Pid = getpid();
56 posix_spawnattr_t spawnAttributes;
57 posix_spawnattr_init(&spawnAttributes);
58 errno = FAIL;
59 int backInfo = FAIL;
60 char **Environ = environ;
61 const char *CommandCStr = "posix delete -i 1024";
62 const char *argv[] = {"sh", "-c", CommandCStr, nullptr};
63 char filepath[] = "/data/storage/el2/base/files/fzl.txt";
64 int fileDescribe = open(filepath, O_CREAT, PARAM_0777);
65 posix_spawn(&Pid, filepath, nullptr, &spawnAttributes, (char *const *)argv, Environ);
66 close(fileDescribe);
67 napi_value result = nullptr;
68 if (errno == FAIL) {
69 backInfo = SUCCESS;
70 }
71 napi_create_int32(env, backInfo, &result);
72 return result;
73 }
74
PosixSpawnP(napi_env env, napi_callback_info info)75 static napi_value PosixSpawnP(napi_env env, napi_callback_info info)
76 {
77 pid_t Pid = PARAM_0;
78 Pid = getpid();
79 posix_spawnattr_t spawnAttributes = {PARAM_0};
80 posix_spawnattr_init(&spawnAttributes);
81 errno = FAIL;
82 int backInfo = FAIL;
83 char **Environ = environ;
84 const char *CommandCStr = nullptr;
85 const char *argv[] = {"sh", "-c", CommandCStr, nullptr};
86 char filepath[] = "/data/storage/el2/base/files/fzl.txt";
87 int fileDescribe = open(filepath, O_CREAT, PARAM_0777);
88 posix_spawnp(&Pid, filepath, nullptr, &spawnAttributes, (char *const *)argv, Environ);
89 napi_value result = nullptr;
90 close(fileDescribe);
91 if (errno == FAIL) {
92 backInfo = SUCCESS;
93 }
94 napi_create_int32(env, backInfo, &result);
95 return result;
96 }
97
PosixSpawnFileActionsAddDup2(napi_env env, napi_callback_info info)98 static napi_value PosixSpawnFileActionsAddDup2(napi_env env, napi_callback_info info)
99 {
100 posix_spawn_file_actions_t param;
101 posix_spawn_file_actions_init(¶m);
102 int ret = posix_spawn_file_actions_adddup2(¶m, SUCCESS, SUCCESS);
103 napi_value result = nullptr;
104 napi_create_int32(env, ret, &result);
105 return result;
106 }
107
PosixSpawnFileActionsAddOpen(napi_env env, napi_callback_info info)108 static napi_value PosixSpawnFileActionsAddOpen(napi_env env, napi_callback_info info)
109 {
110 errno = FAIL;
111 int returnValue = FAIL;
112 posix_spawn_file_actions_t param;
113 posix_spawn_file_actions_init(¶m);
114 int fileDescribe = open("/data/storage/el2/base/files/fzl.txt", O_CREAT, PARAM_0777);
115 posix_spawn_file_actions_addopen(¶m, fileDescribe, "/data/storage/el2/base/files/fzl.txt", O_CREAT, S_IXGRP);
116 napi_value result = nullptr;
117 if (errno == FAIL) {
118 returnValue = SUCCESS;
119 }
120 close(fileDescribe);
121 napi_create_int32(env, returnValue, &result);
122 return result;
123 }
124
125 extern "C" int __fstat_time64(int, struct stat *);
PosixSpawnFileActionsDestory(napi_env env, napi_callback_info info)126 static napi_value PosixSpawnFileActionsDestory(napi_env env, napi_callback_info info)
127 {
128 posix_spawn_file_actions_t param;
129 posix_spawn_file_actions_init(¶m);
130 int ret = posix_spawn_file_actions_destroy(¶m);
131 napi_value result = nullptr;
132 napi_create_int32(env, ret, &result);
133 return result;
134 }
135
PosixSpawnFileActionsInit(napi_env env, napi_callback_info info)136 static napi_value PosixSpawnFileActionsInit(napi_env env, napi_callback_info info)
137 {
138 posix_spawn_file_actions_t param;
139 int returnValue = posix_spawn_file_actions_init(¶m);
140 napi_value result = nullptr;
141 napi_create_int32(env, returnValue, &result);
142 return result;
143 }
144
PosixSpawnAttrDestory(napi_env env, napi_callback_info info)145 static napi_value PosixSpawnAttrDestory(napi_env env, napi_callback_info info)
146 {
147 posix_spawnattr_t param;
148 param.__flags = SUCCESS;
149 param.__pgrp = SUCCESS;
150 param.__prio = SUCCESS;
151 param.__pol = SUCCESS;
152 posix_spawnattr_init(¶m);
153 int returnValue = posix_spawnattr_destroy(¶m);
154 napi_value result = nullptr;
155 napi_create_int32(env, returnValue, &result);
156 return result;
157 }
158
PosixSpawnAttrGetpGroup(napi_env env, napi_callback_info info)159 static napi_value PosixSpawnAttrGetpGroup(napi_env env, napi_callback_info info)
160 {
161 posix_spawnattr_t param;
162 pid_t pid;
163 pid = getpid();
164 posix_spawnattr_init(¶m);
165 int returnValue = posix_spawnattr_getpgroup(¶m, &pid);
166 napi_value result = nullptr;
167 napi_create_int32(env, returnValue, &result);
168 return result;
169 }
170
PosixSpawnAttrGetSchedParam(napi_env env, napi_callback_info info)171 static napi_value PosixSpawnAttrGetSchedParam(napi_env env, napi_callback_info info)
172 {
173 posix_spawnattr_t param;
174 posix_spawnattr_init(¶m);
175 struct sched_param *secondParam = nullptr;
176 int returnValue = posix_spawnattr_getschedparam(¶m, secondParam);
177 napi_value result = nullptr;
178 napi_create_int32(env, returnValue, &result);
179 return result;
180 }
181
PosixSpawnAttrGetSchedPolicy(napi_env env, napi_callback_info info)182 static napi_value PosixSpawnAttrGetSchedPolicy(napi_env env, napi_callback_info info)
183 {
184 posix_spawnattr_t param;
185 posix_spawnattr_init(¶m);
186 int *secondParam = nullptr;
187 int returnValue = posix_spawnattr_getschedpolicy(¶m, secondParam);
188 napi_value result = nullptr;
189 napi_create_int32(env, returnValue, &result);
190 return result;
191 }
192
PosixSpawnAttrGetSigDefault(napi_env env, napi_callback_info info)193 static napi_value PosixSpawnAttrGetSigDefault(napi_env env, napi_callback_info info)
194 {
195 posix_spawnattr_t param;
196 sigset_t secondParam;
197 int returnValue = posix_spawnattr_getsigdefault(¶m, &secondParam);
198 napi_value result = nullptr;
199 napi_create_int32(env, returnValue, &result);
200 return result;
201 }
202
PosixSpawnAttrGetSigMask(napi_env env, napi_callback_info info)203 static napi_value PosixSpawnAttrGetSigMask(napi_env env, napi_callback_info info)
204 {
205 posix_spawnattr_t param;
206 posix_spawnattr_init(¶m);
207 sigset_t secondParam;
208 int returnValue = posix_spawnattr_getsigmask(¶m, &secondParam);
209 napi_value result = nullptr;
210 napi_create_int32(env, returnValue, &result);
211 return result;
212 }
213
PosixSpawnAttrInit(napi_env env, napi_callback_info info)214 static napi_value PosixSpawnAttrInit(napi_env env, napi_callback_info info)
215 {
216 posix_spawnattr_t param;
217 int returnValue = posix_spawnattr_init(¶m);
218 napi_value result = nullptr;
219 napi_create_int32(env, returnValue, &result);
220 return result;
221 }
222
PosixSpawnAttrSetFlags(napi_env env, napi_callback_info info)223 static napi_value PosixSpawnAttrSetFlags(napi_env env, napi_callback_info info)
224 {
225 posix_spawnattr_t param;
226 int returnValue = posix_spawnattr_setflags(¶m, SUCCESS);
227 napi_value result = nullptr;
228 napi_create_int32(env, returnValue, &result);
229 return result;
230 }
231
PosixSpawnAttrSetSigDefault(napi_env env, napi_callback_info info)232 static napi_value PosixSpawnAttrSetSigDefault(napi_env env, napi_callback_info info)
233 {
234 posix_spawnattr_t param;
235 posix_spawnattr_init(¶m);
236 sigset_t paramSecond;
237 int returnValue = posix_spawnattr_setsigdefault(¶m, ¶mSecond);
238 napi_value result = nullptr;
239 napi_create_int32(env, returnValue, &result);
240 return result;
241 }
242
PosixSpawnAttrSetSigMask(napi_env env, napi_callback_info info)243 static napi_value PosixSpawnAttrSetSigMask(napi_env env, napi_callback_info info)
244 {
245 posix_spawnattr_t param;
246 posix_spawnattr_init(¶m);
247 sigset_t paramSecond;
248 int returnValue = posix_spawnattr_setsigmask(¶m, ¶mSecond);
249 napi_value result = nullptr;
250 napi_create_int32(env, returnValue, &result);
251 return result;
252 }
253
PosixSpawnAttrSetSchedPolicy(napi_env env, napi_callback_info info)254 static napi_value PosixSpawnAttrSetSchedPolicy(napi_env env, napi_callback_info info)
255 {
256 posix_spawnattr_t param;
257 posix_spawnattr_init(¶m);
258 int paramSecond = SUCCESS;
259 int returnValue = posix_spawnattr_setschedpolicy(¶m, paramSecond);
260 napi_value result = nullptr;
261 napi_create_int32(env, returnValue, &result);
262 return result;
263 }
264
PosixSpawnAttrSetSchedParam(napi_env env, napi_callback_info info)265 static napi_value PosixSpawnAttrSetSchedParam(napi_env env, napi_callback_info info)
266 {
267 posix_spawnattr_t param;
268 posix_spawnattr_init(¶m);
269 sched_param *paramSecond;
270 int returnValue = posix_spawnattr_setschedparam(¶m, paramSecond);
271 napi_value result = nullptr;
272 napi_create_int32(env, returnValue, &result);
273 return result;
274 }
275
PosixSpawnAttrSetPGroup(napi_env env, napi_callback_info info)276 static napi_value PosixSpawnAttrSetPGroup(napi_env env, napi_callback_info info)
277 {
278 posix_spawnattr_t param;
279 posix_spawnattr_init(¶m);
280 pid_t pid;
281 pid = getpid();
282 int returnValue = posix_spawnattr_setpgroup(¶m, pid);
283 napi_value result = nullptr;
284 napi_create_int32(env, returnValue, &result);
285 return result;
286 }
287
Init(napi_env env, napi_value exports)288 EXTERN_C_START static napi_value Init(napi_env env, napi_value exports)
289 {
290 napi_property_descriptor desc[] = {
291 {"posixSpawnAttrGetFlags", nullptr, PosixSpawnAttrGetflags, nullptr, nullptr, nullptr, napi_default, nullptr},
292 {"posixSpawnFileActionsAddClose", nullptr, PosixSpawnFileActionsAddclose, nullptr, nullptr, nullptr,
293 napi_default, nullptr},
294 {"posixSpawn", nullptr, PosixSpawn, nullptr, nullptr, nullptr, napi_default, nullptr},
295 {"posixSpawnFileActionsAdddup2", nullptr, PosixSpawnFileActionsAddDup2, nullptr, nullptr, nullptr, napi_default,
296 nullptr},
297 {"posixSpawnFileActionsAddopen", nullptr, PosixSpawnFileActionsAddOpen, nullptr, nullptr, nullptr, napi_default,
298 nullptr},
299 {"posixSpawnFileActionsDestroy", nullptr, PosixSpawnFileActionsDestory, nullptr, nullptr, nullptr, napi_default,
300 nullptr},
301 {"posixSpawnFileActionsInit", nullptr, PosixSpawnFileActionsInit, nullptr, nullptr, nullptr, napi_default,
302 nullptr},
303 {"posixSpawnAttrDestroy", nullptr, PosixSpawnAttrDestory, nullptr, nullptr, nullptr, napi_default, nullptr},
304 {"posixSpawnAttrGetpGroup", nullptr, PosixSpawnAttrGetpGroup, nullptr, nullptr, nullptr, napi_default, nullptr},
305 {"posixSpawnAttrGetSchedParam", nullptr, PosixSpawnAttrGetSchedParam, nullptr, nullptr, nullptr, napi_default,
306 nullptr},
307 {"posixSpawnAttrGetSchedPolicy", nullptr, PosixSpawnAttrGetSchedPolicy, nullptr, nullptr, nullptr, napi_default,
308 nullptr},
309 {"posixSpawnAttrGetSigDefault", nullptr, PosixSpawnAttrGetSigDefault, nullptr, nullptr, nullptr, napi_default,
310 nullptr},
311 {"posixSpawnAttrGetSigMask", nullptr, PosixSpawnAttrGetSigMask, nullptr, nullptr, nullptr, napi_default,
312 nullptr},
313 {"posixSpawnAttrInit", nullptr, PosixSpawnAttrInit, nullptr, nullptr, nullptr, napi_default, nullptr},
314 {"posixSpawnAttrSetFlags", nullptr, PosixSpawnAttrSetFlags, nullptr, nullptr, nullptr, napi_default, nullptr},
315 {"posixSpawnP", nullptr, PosixSpawnP, nullptr, nullptr, nullptr, napi_default, nullptr},
316 {"posixSpawnAttrSetSigDefault", nullptr, PosixSpawnAttrSetSigDefault, nullptr, nullptr, nullptr, napi_default,
317 nullptr},
318 {"posixSpawnAttrSetSigMask", nullptr, PosixSpawnAttrSetSigMask, nullptr, nullptr, nullptr, napi_default,
319 nullptr},
320 {"posixSpawnAttrSetSchedPolicy", nullptr, PosixSpawnAttrSetSchedPolicy, nullptr, nullptr, nullptr, napi_default,
321 nullptr},
322 {"posixSpawnAttrSetSchedParam", nullptr, PosixSpawnAttrSetSchedParam, nullptr, nullptr, nullptr, napi_default,
323 nullptr},
324 {"posixSpawnAttrSetPGroup", nullptr, PosixSpawnAttrSetPGroup, nullptr, nullptr, nullptr, napi_default, nullptr},
325 };
326 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
327 return exports;
328 }
329 EXTERN_C_END
330
331 static napi_module demoModule = {
332 .nm_version = 1,
333 .nm_flags = 0,
334 .nm_filename = nullptr,
335 .nm_register_func = Init,
336 .nm_modname = "libspawnndk",
337 .nm_priv = ((void *)0),
338 .reserved = {0},
339 };
340
RegisterModule(void)341 extern "C" __attribute__((constructor)) void RegisterModule(void) { napi_module_register(&demoModule); }