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