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(&param);
46     int ret = posix_spawn_file_actions_addclose(&param, 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(&param);
102     int ret = posix_spawn_file_actions_adddup2(&param, 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(&param);
114     int fileDescribe = open("/data/storage/el2/base/files/fzl.txt", O_CREAT, PARAM_0777);
115     posix_spawn_file_actions_addopen(&param, 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(&param);
130     int ret = posix_spawn_file_actions_destroy(&param);
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(&param);
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(&param);
153     int returnValue = posix_spawnattr_destroy(&param);
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(&param);
165     int returnValue = posix_spawnattr_getpgroup(&param, &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(&param);
175     struct sched_param *secondParam = nullptr;
176     int returnValue = posix_spawnattr_getschedparam(&param, 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(&param);
186     int *secondParam = nullptr;
187     int returnValue = posix_spawnattr_getschedpolicy(&param, 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(&param, &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(&param);
207     sigset_t secondParam;
208     int returnValue = posix_spawnattr_getsigmask(&param, &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(&param);
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(&param, 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(&param);
236     sigset_t paramSecond;
237     int returnValue = posix_spawnattr_setsigdefault(&param, &paramSecond);
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(&param);
247     sigset_t paramSecond;
248     int returnValue = posix_spawnattr_setsigmask(&param, &paramSecond);
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(&param);
258     int paramSecond = SUCCESS;
259     int returnValue = posix_spawnattr_setschedpolicy(&param, 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(&param);
269     sched_param *paramSecond;
270     int returnValue = posix_spawnattr_setschedparam(&param, 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(&param);
280     pid_t pid;
281     pid = getpid();
282     int returnValue = posix_spawnattr_setpgroup(&param, 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); }