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 <csignal>
17 #include <cstdio>
18 #include <cstdlib>
19 #include <cstring>
20 #include <fcntl.h>
21 #include <js_native_api.h>
22 #include <node_api.h>
23 #include <pthread.h>
24 #include <sys/signalfd.h>
25 #include <unistd.h>
26
27 #define PARAM_0 0
28 #define PARAM_1 1
29 #define PARAM_2 2
30 #define PARAM_6000 6000
31 #define PARAM_99999 99999
32 #define FAIL (-1)
33 #define NO_ERR 0
34 #define STRLENGTH 64
35 #define SUCCESS 1
36 #define ONE 1
37 #define SFD_CLOEXEC O_CLOEXEC
38 #define ONEVAL 1
39 #define MINUSONE (-1)
40 #define MINUSTWO (-2)
41 #define THRVAL 3
42 #define ERRON_0 0
43 typedef void *(Func)(void *);
44 struct Sig {
45 int flag;
46 int param;
47 };
48 struct SigString {
49 int flag;
50 char param[STRLENGTH];
51 };
intInput(napi_env env,napi_callback_info info)52 static int intInput(napi_env env, napi_callback_info info)
53 {
54 size_t argc = PARAM_1;
55 napi_value args[1] = {nullptr};
56 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
57 int expect;
58 napi_get_value_int32(env, args[0], &expect);
59 return expect;
60 }
61
structInput(napi_env env,napi_callback_info info,struct Sig * siginfo)62 static void structInput(napi_env env, napi_callback_info info, struct Sig *siginfo)
63 {
64 size_t argc = PARAM_2;
65 napi_value args[2] = {nullptr};
66 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
67 napi_get_value_int32(env, args[0], &(siginfo->flag));
68 napi_get_value_int32(env, args[1], &(siginfo->param));
69 }
70
structStringInput(napi_env env,napi_callback_info info,struct SigString * siginfo)71 static void structStringInput(napi_env env, napi_callback_info info, struct SigString *siginfo)
72 {
73 size_t argc = PARAM_2;
74 napi_value args[2] = {nullptr};
75 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
76 napi_get_value_int32(env, args[0], &(siginfo->flag));
77 size_t size = STRLENGTH;
78 size_t actualVal = PARAM_0;
79 napi_get_value_string_utf8(env, args[1], siginfo->param, size, &actualVal);
80 }
81
SigMain(struct Sig siginfo,Func testfunction)82 static int SigMain(struct Sig siginfo, Func testfunction)
83 {
84 pthread_t pid;
85
86 pthread_create(&pid, nullptr, testfunction, &siginfo);
87 pthread_detach(pid);
88
89 return NO_ERR;
90 }
SigMainInt(int siginfo,Func testfunction)91 static int SigMainInt(int siginfo, Func testfunction)
92 {
93 pthread_t pid;
94
95 pthread_create(&pid, nullptr, testfunction, &siginfo);
96 pthread_detach(pid);
97
98 return NO_ERR;
99 }
SigMainNull(Func testfunction)100 static int SigMainNull(Func testfunction)
101 {
102 pthread_t pid;
103
104 pthread_create(&pid, nullptr, testfunction, nullptr);
105 pthread_detach(pid);
106
107 return NO_ERR;
108 }
SigMainString(struct SigString siginfo,Func testfunction)109 static int SigMainString(struct SigString siginfo, Func testfunction)
110 {
111 pthread_t pid;
112
113 pthread_create(&pid, nullptr, testfunction, &siginfo);
114 pthread_detach(pid);
115
116 return NO_ERR;
117 }
Sighold(void * pro)118 void *Sighold(void *pro)
119 {
120 Sig *sigInfo = (Sig *)pro;
121 if ((sigInfo->flag) == PARAM_0) {
122 int sig = SIGALRM;
123 sighold(sig);
124 } else {
125 sighold(sigInfo->param);
126 }
127 return nullptr;
128 }
129
SigMainHold(napi_env env,napi_callback_info info)130 static napi_value SigMainHold(napi_env env, napi_callback_info info)
131 {
132 napi_value result = nullptr;
133 struct Sig siginput;
134 structInput(env, info, &siginput);
135 int resSig = SigMain(siginput, Sighold);
136 napi_create_int32(env, resSig, &result);
137 return result;
138 }
139
Sigrelse(void * pro)140 void *Sigrelse(void *pro)
141 {
142 Sig *sigInfo = (Sig *)pro;
143 if ((sigInfo->flag) == PARAM_0) {
144 int sig = SIGALRM;
145 sigrelse(sig);
146 } else {
147 sigrelse(sigInfo->param);
148 }
149 return nullptr;
150 }
151
SigMainRelse(napi_env env,napi_callback_info info)152 static napi_value SigMainRelse(napi_env env, napi_callback_info info)
153 {
154 napi_value result = nullptr;
155 struct Sig siginput;
156 structInput(env, info, &siginput);
157 int resSig = SigMain(siginput, Sigrelse);
158 napi_create_int32(env, resSig, &result);
159 return result;
160 }
161
Sigdelset(void * pro)162 void *Sigdelset(void *pro)
163 {
164 sigset_t set = {PARAM_0};
165 Sig *sigInfo = (Sig *)pro;
166 sigemptyset(&set);
167 if ((sigInfo->flag) == PARAM_0) {
168 int sig = SIGALRM;
169 sigdelset(&set, sig);
170 } else {
171 sigdelset(&set, sigInfo->param);
172 }
173 return nullptr;
174 }
175
SigMainDelset(napi_env env,napi_callback_info info)176 static napi_value SigMainDelset(napi_env env, napi_callback_info info)
177 {
178 napi_value result = nullptr;
179 struct Sig siginput;
180 structInput(env, info, &siginput);
181 int resSig = SigMain(siginput, Sigdelset);
182 napi_create_int32(env, resSig, &result);
183 return result;
184 }
185
Sigaddset(void * pro)186 void *Sigaddset(void *pro)
187 {
188 sigset_t set = {PARAM_0};
189 Sig *sigInfo = (Sig *)pro;
190 sigemptyset(&set);
191 if ((sigInfo->flag) == PARAM_0) {
192 int sig = SIGALRM;
193 sigaddset(&set, sig);
194 } else {
195 sigaddset(&set, sigInfo->param);
196 }
197 return nullptr;
198 }
199
SigMainAddset(napi_env env,napi_callback_info info)200 static napi_value SigMainAddset(napi_env env, napi_callback_info info)
201 {
202 napi_value result = nullptr;
203 struct Sig siginput;
204 structInput(env, info, &siginput);
205 int resSig = SigMain(siginput, Sigaddset);
206 napi_create_int32(env, resSig, &result);
207 return result;
208 }
209
Sigemptyset(void * pro)210 void *Sigemptyset(void *pro)
211 {
212 sigset_t set = {PARAM_0};
213 sigemptyset(&set);
214 return nullptr;
215 }
216
SigMainEmptyset(napi_env env,napi_callback_info info)217 static napi_value SigMainEmptyset(napi_env env, napi_callback_info info)
218 {
219 napi_value result = nullptr;
220 int resSig = SigMainNull(Sigemptyset);
221 napi_create_int32(env, resSig, &result);
222 return result;
223 }
224
Sigfillset(void * pro)225 void *Sigfillset(void *pro)
226 {
227 sigset_t set = {PARAM_0};
228 sigfillset(&set);
229 return nullptr;
230 }
231
SigMainFillset(napi_env env,napi_callback_info info)232 static napi_value SigMainFillset(napi_env env, napi_callback_info info)
233 {
234 napi_value result = nullptr;
235 int resSig = SigMainNull(Sigfillset);
236 napi_create_int32(env, resSig, &result);
237 return result;
238 }
239
SignalHandler(int signum)240 void SignalHandler(int signum) {}
Sigaction(void * pro)241 void *Sigaction(void *pro)
242 {
243 Sig *sigInfo = (Sig *)pro;
244 struct sigaction sigabrt = {.sa_handler = SignalHandler};
245 if ((sigInfo->flag) == PARAM_0) {
246 sigaction(SIGABRT, &sigabrt, nullptr);
247 } else {
248 sigaction(sigInfo->param, &sigabrt, nullptr);
249 }
250 return nullptr;
251 }
252
SigMainAction(napi_env env,napi_callback_info info)253 static napi_value SigMainAction(napi_env env, napi_callback_info info)
254 {
255 napi_value result = nullptr;
256 struct Sig siginput;
257 structInput(env, info, &siginput);
258 int resSig = SigMain(siginput, Sigaction);
259 napi_create_int32(env, resSig, &result);
260 return result;
261 }
262
Sigaltstack(void * pro)263 void *Sigaltstack(void *pro)
264 {
265 Sig *sigInfo = (Sig *)pro;
266 stack_t ss = {PARAM_0};
267 ss.ss_size = SIGSTKSZ;
268 if ((sigInfo->flag) == PARAM_0) {
269 ss.ss_flags = PARAM_0;
270 sigaltstack(&ss, nullptr);
271 } else {
272 ss.ss_flags = MINUSONE;
273 sigaltstack(&ss, nullptr);
274 }
275 return nullptr;
276 }
277
SigMainAltstack(napi_env env,napi_callback_info info)278 static napi_value SigMainAltstack(napi_env env, napi_callback_info info)
279 {
280 napi_value result = nullptr;
281 int resSig = SigMainInt(intInput(env, info), Sigaltstack);
282 napi_create_int32(env, resSig, &result);
283 return result;
284 }
285
Sigignore(void * pro)286 void *Sigignore(void *pro)
287 {
288 Sig *sigInfo = (Sig *)pro;
289 if ((sigInfo->flag) == PARAM_0) {
290 sigignore(SIGALRM);
291 } else {
292 sigignore(sigInfo->param);
293 }
294 return nullptr;
295 }
296
SigMainIgnore(napi_env env,napi_callback_info info)297 static napi_value SigMainIgnore(napi_env env, napi_callback_info info)
298 {
299 napi_value result = nullptr;
300 struct Sig siginput;
301 structInput(env, info, &siginput);
302 int resSig = SigMain(siginput, Sigignore);
303 napi_create_int32(env, resSig, &result);
304 return result;
305 }
306
Sigpause(void * pro)307 void *Sigpause(void *pro)
308 {
309 sigpause(SIGALRM);
310 return nullptr;
311 }
312
SigMainPause(napi_env env,napi_callback_info info)313 static napi_value SigMainPause(napi_env env, napi_callback_info info)
314 {
315 napi_value result = nullptr;
316 int resSig = SigMainNull(Sigpause);
317 napi_create_int32(env, resSig, &result);
318 return result;
319 }
320
Sigpending(void * pro)321 void *Sigpending(void *pro)
322 {
323 sigset_t pending = {PARAM_0};
324 sigpending(&pending);
325 return nullptr;
326 }
327
SigMainPending(napi_env env,napi_callback_info info)328 static napi_value SigMainPending(napi_env env, napi_callback_info info)
329 {
330 napi_value result = nullptr;
331 int resSig = SigMainNull(Sigpending);
332 napi_create_int32(env, resSig, &result);
333 return result;
334 }
335
Sigprocmask(void * pro)336 void *Sigprocmask(void *pro)
337 {
338 Sig *sigInfo = (Sig *)pro;
339 sigset_t set = {PARAM_0}, set2 = {PARAM_0};
340 if ((sigInfo->flag) == PARAM_0) {
341 sigprocmask(SIG_UNBLOCK, &set, &set2);
342 } else {
343 sigprocmask(sigInfo->param, &set, &set2);
344 }
345 return nullptr;
346 }
347
SigMainProcmask(napi_env env,napi_callback_info info)348 static napi_value SigMainProcmask(napi_env env, napi_callback_info info)
349 {
350 napi_value result = nullptr;
351 struct Sig siginput;
352 structInput(env, info, &siginput);
353 int resSig = SigMain(siginput, Sigprocmask);
354 napi_create_int32(env, resSig, &result);
355 return result;
356 }
357
Kill(napi_env env,napi_callback_info info)358 static napi_value Kill(napi_env env, napi_callback_info info)
359 {
360 napi_value result = {PARAM_0};
361 napi_create_int32(env, PARAM_0, &result);
362 return result;
363 }
364
Killpg(napi_env env,napi_callback_info info)365 static napi_value Killpg(napi_env env, napi_callback_info info)
366 {
367 napi_value result = {PARAM_0};
368 napi_create_int32(env, PARAM_0, &result);
369 return result;
370 }
Psignal(void * pro)371 void *Psignal(void *pro)
372 {
373 SigString *sigInfo = (SigString *)pro;
374 psignal(sigInfo->flag, sigInfo->param);
375 return nullptr;
376 }
377
SigMainPsignal(napi_env env,napi_callback_info info)378 static napi_value SigMainPsignal(napi_env env, napi_callback_info info)
379 {
380 napi_value result = nullptr;
381 struct SigString siginput;
382 structStringInput(env, info, &siginput);
383 int resSig = SigMainString(siginput, Psignal);
384 napi_create_int32(env, resSig, &result);
385 return result;
386 }
387
PSigInfo(void * pro)388 void *PSigInfo(void *pro)
389 {
390 char paramSecond[STRLENGTH];
391 siginfo_t siginfo = {PARAM_0};
392 psiginfo(&siginfo, paramSecond);
393 return nullptr;
394 }
395
SigMainPSigInfo(napi_env env,napi_callback_info info)396 static napi_value SigMainPSigInfo(napi_env env, napi_callback_info info)
397 {
398 napi_value result = nullptr;
399 int resSig = SigMainNull(PSigInfo);
400 napi_create_int32(env, resSig, &result);
401 return result;
402 }
403
Raise(napi_env env,napi_callback_info info)404 static napi_value Raise(napi_env env, napi_callback_info info)
405 {
406 napi_value result = PARAM_0;
407 napi_create_int32(env, PARAM_0, &result);
408 return result;
409 }
Sigwait(void * pro)410 void *Sigwait(void *pro)
411 {
412 sigset_t set = {0};
413 sigemptyset(&set);
414 int sig = SIGALRM;
415 sigaddset(&set, sig);
416 sigprocmask(SIG_BLOCK, &set, nullptr);
417 union sigval sigval = {.sival_int = ONE};
418 sigqueue(getpid(), sig, sigval);
419 sig = PARAM_0;
420 sigwait(&set, &sig);
421 return nullptr;
422 }
423
SigMainWait(napi_env env,napi_callback_info info)424 static napi_value SigMainWait(napi_env env, napi_callback_info info)
425 {
426 napi_value result = nullptr;
427 int resSig = SigMainNull(Sigwait);
428 napi_create_int32(env, resSig, &result);
429 return result;
430 }
431
Sigwaitinfo(void * pro)432 void *Sigwaitinfo(void *pro)
433 {
434 sigset_t set;
435 sigemptyset(&set);
436 int sig = SIGALRM;
437 sigaddset(&set, sig);
438 sigprocmask(SIG_BLOCK, &set, nullptr);
439 union sigval sigval = {.sival_int = ONE};
440 sigqueue(getpid(), sig, sigval);
441 siginfo_t info;
442 sigwaitinfo(&set, &info);
443 return nullptr;
444 }
445
SigMainWaitinfo(napi_env env,napi_callback_info info)446 static napi_value SigMainWaitinfo(napi_env env, napi_callback_info info)
447 {
448 napi_value result = nullptr;
449 int resSig = SigMainNull(Sigwaitinfo);
450 napi_create_int32(env, resSig, &result);
451 return result;
452 }
453
Sigismember(void * pro)454 void *Sigismember(void *pro)
455 {
456 Sig *sigInfo = (Sig *)pro;
457 sigset_t set = {PARAM_0};
458 if ((sigInfo->flag) == PARAM_0) {
459 int sig = SIGALRM;
460 sigismember(&set, sig);
461 } else if ((sigInfo->flag) == MINUSONE) {
462 sigismember(&set, sigInfo->param);
463 } else {
464 sigemptyset(&set);
465 sigaddset(&set, SIGINT);
466 sigismember(&set, SIGINT);
467 }
468 return nullptr;
469 }
470
SigMainIsmember(napi_env env,napi_callback_info info)471 static napi_value SigMainIsmember(napi_env env, napi_callback_info info)
472 {
473 napi_value result = nullptr;
474 struct Sig siginput;
475 structInput(env, info, &siginput);
476 int resSig = SigMain(siginput, Sigismember);
477 napi_create_int32(env, resSig, &result);
478 return result;
479 }
480
481 static int g_count = PARAM_0;
signalHandler(int signo)482 static void signalHandler(int signo) { g_count++; }
Signal(void * pro)483 void *Signal(void *pro)
484 {
485 signal(SIGHUP, signalHandler);
486 return nullptr;
487 }
488
SigMainSignal(napi_env env,napi_callback_info info)489 static napi_value SigMainSignal(napi_env env, napi_callback_info info)
490 {
491 napi_value result = nullptr;
492 int resSig = SigMainNull(Signal);
493 napi_create_int32(env, resSig, &result);
494 return result;
495 }
496
Signalfd(void * pro)497 void *Signalfd(void *pro)
498 {
499 const int sig = SIGALRM;
500 sigset_t mask = {};
501 sigaddset(&mask, sig);
502 sigprocmask(SIG_SETMASK, &mask, nullptr);
503 signalfd(MINUSONE, &mask, SFD_CLOEXEC);
504 return nullptr;
505 }
506
SigMainNalfd(napi_env env,napi_callback_info info)507 static napi_value SigMainNalfd(napi_env env, napi_callback_info info)
508 {
509 napi_value result = nullptr;
510 int resSig = SigMainNull(Signalfd);
511 napi_create_int32(env, resSig, &result);
512 return result;
513 }
514
unsupported_api(const char * Func)515 static inline void unsupported_api(const char *Func) { fprintf(stderr, "[ERR]Unsupported API %s\n", Func); }
Siginterrupt(void * pro)516 void *Siginterrupt(void *pro)
517 {
518 int sig = SIGABRT;
519 int flag = PARAM_0;
520 struct sigaction sa;
521 unsupported_api(__FUNCTION__);
522 struct sigaction sigabrt = {.sa_handler = SignalHandler};
523 sigaction(sig, &sigabrt, nullptr);
524 if (flag) {
525 sa.sa_flags &= ~SA_RESTART;
526 } else {
527 sa.sa_flags |= SA_RESTART;
528 }
529 siginterrupt(sig, ONEVAL);
530 return nullptr;
531 }
532
SigMainInterrupt(napi_env env,napi_callback_info info)533 static napi_value SigMainInterrupt(napi_env env, napi_callback_info info)
534 {
535 napi_value result = nullptr;
536 int resSig = SigMainNull(Siginterrupt);
537 napi_create_int32(env, resSig, &result);
538 return result;
539 }
540
Sigset(void * pro)541 void *Sigset(void *pro)
542 {
543 if (*(static_cast<int*>(pro)) == PARAM_0) {
544 sigset(SIGALRM, SIG_DFL);
545 } else {
546 sigset(PARAM_99999, SIG_DFL);
547 }
548 return nullptr;
549 }
550
SigMainSet(napi_env env,napi_callback_info info)551 static napi_value SigMainSet(napi_env env, napi_callback_info info)
552 {
553 napi_value result = nullptr;
554 int resSig = SigMainInt(intInput(env, info), Sigset);
555 napi_create_int32(env, resSig, &result);
556 return result;
557 }
558
Sigtimedwait(void * pro)559 void *Sigtimedwait(void *pro)
560 {
561 sigset_t set2 = {PARAM_0};
562 siginfo_t siginfo = {PARAM_0};
563 struct timespec timeout = {THRVAL, PARAM_0};
564 sigemptyset(&set2);
565 sigaddset(&set2, SIGCHLD);
566 sigtimedwait(&set2, &siginfo, &timeout);
567 return nullptr;
568 }
569
SigMainTimedwait(napi_env env,napi_callback_info info)570 static napi_value SigMainTimedwait(napi_env env, napi_callback_info info)
571 {
572 napi_value result = nullptr;
573 int resSig = SigMainNull(Sigtimedwait);
574 napi_create_int32(env, resSig, &result);
575 return result;
576 }
577
Sigqueue(void * pro)578 void *Sigqueue(void *pro)
579 {
580 Sig *sigInfo = (Sig *)pro;
581 union sigval sigval = {.sival_int = ONEVAL};
582 if (sigInfo->flag == PARAM_0) {
583 int sig = SIGALRM;
584 sigqueue(getpid(), sig, sigval);
585 } else {
586 sigqueue(getpid(), sigInfo->param, sigval);
587 }
588 return nullptr;
589 }
590
SigMainQueue(napi_env env,napi_callback_info info)591 static napi_value SigMainQueue(napi_env env, napi_callback_info info)
592 {
593 napi_value result = nullptr;
594 struct Sig siginput;
595 structInput(env, info, &siginput);
596 int resSig = SigMain(siginput, Sigqueue);
597 napi_create_int32(env, resSig, &result);
598 return result;
599 }
600
601 static int g_countNum = ERRON_0;
signaler(int signo)602 static void signaler(int signo) { g_countNum++; }
BsdSignal(void * pro)603 void *BsdSignal(void *pro)
604 {
605 bsd_signal(SIGHUP, signaler);
606 return nullptr;
607 }
608
SigMainBsdSignal(napi_env env,napi_callback_info info)609 static napi_value SigMainBsdSignal(napi_env env, napi_callback_info info)
610 {
611 napi_value result = nullptr;
612 int resSig = SigMainNull(BsdSignal);
613 napi_create_int32(env, resSig, &result);
614 return result;
615 }
616
Sigsuspend(void * pro)617 void *Sigsuspend(void *pro)
618 {
619 int sig = SIGALRM;
620 sigset_t set_without_sig;
621 sigfillset(&set_without_sig);
622 sigdelset(&set_without_sig, sig);
623 sigsuspend(&set_without_sig);
624 return nullptr;
625 }
626
SigMainSuspend(napi_env env,napi_callback_info info)627 static napi_value SigMainSuspend(napi_env env, napi_callback_info info)
628 {
629 napi_value result = nullptr;
630 int resSig = SigMainNull(Sigsuspend);
631 napi_create_int32(env, resSig, &result);
632 return result;
633 }
634
635 EXTERN_C_START
Init(napi_env env,napi_value exports)636 static napi_value Init(napi_env env, napi_value exports)
637 {
638 napi_property_descriptor desc[] = {
639 {"sighold", nullptr, SigMainHold, nullptr, nullptr, nullptr, napi_default, nullptr},
640 {"sigrelse", nullptr, SigMainRelse, nullptr, nullptr, nullptr, napi_default, nullptr},
641 {"sigdelset", nullptr, SigMainDelset, nullptr, nullptr, nullptr, napi_default, nullptr},
642 {"sigaddset", nullptr, SigMainAddset, nullptr, nullptr, nullptr, napi_default, nullptr},
643 {"sigemptyset", nullptr, SigMainEmptyset, nullptr, nullptr, nullptr, napi_default, nullptr},
644 {"sigfillset", nullptr, SigMainFillset, nullptr, nullptr, nullptr, napi_default, nullptr},
645 {"sigaction", nullptr, SigMainAction, nullptr, nullptr, nullptr, napi_default, nullptr},
646 {"sigaltstack", nullptr, SigMainAltstack, nullptr, nullptr, nullptr, napi_default, nullptr},
647 {"sigignore", nullptr, SigMainIgnore, nullptr, nullptr, nullptr, napi_default, nullptr},
648 {"sigpause", nullptr, SigMainPause, nullptr, nullptr, nullptr, napi_default, nullptr},
649 {"sigpending", nullptr, SigMainPending, nullptr, nullptr, nullptr, napi_default, nullptr},
650 {"sigprocmask", nullptr, SigMainProcmask, nullptr, nullptr, nullptr, napi_default, nullptr},
651 {"sigismember", nullptr, SigMainIsmember, nullptr, nullptr, nullptr, napi_default, nullptr},
652 {"signal", nullptr, SigMainSignal, nullptr, nullptr, nullptr, napi_default, nullptr},
653 {"signalfd", nullptr, SigMainNalfd, nullptr, nullptr, nullptr, napi_default, nullptr},
654 {"siginterrupt", nullptr, SigMainInterrupt, nullptr, nullptr, nullptr, napi_default, nullptr},
655 {"sigset", nullptr, SigMainSet, nullptr, nullptr, nullptr, napi_default, nullptr},
656 {"sigtimedwait", nullptr, SigMainTimedwait, nullptr, nullptr, nullptr, napi_default, nullptr},
657 {"sigqueue", nullptr, SigMainQueue, nullptr, nullptr, nullptr, napi_default, nullptr},
658 {"sigwait", nullptr, SigMainWait, nullptr, nullptr, nullptr, napi_default, nullptr},
659 {"sigwaitinfo", nullptr, SigMainWaitinfo, nullptr, nullptr, nullptr, napi_default, nullptr},
660 {"kill", nullptr, Kill, nullptr, nullptr, nullptr, napi_default, nullptr},
661 {"killpg", nullptr, Killpg, nullptr, nullptr, nullptr, napi_default, nullptr},
662 {"raise", nullptr, Raise, nullptr, nullptr, nullptr, napi_default, nullptr},
663 {"psignal", nullptr, SigMainPsignal, nullptr, nullptr, nullptr, napi_default, nullptr},
664 {"pSigInfo", nullptr, SigMainPSigInfo, nullptr, nullptr, nullptr, napi_default, nullptr},
665 {"bsdSignal", nullptr, SigMainBsdSignal, nullptr, nullptr, nullptr, napi_default, nullptr},
666 {"sigsuspend", nullptr, SigMainSuspend, nullptr, nullptr, nullptr, napi_default, nullptr},
667 };
668 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
669 return exports;
670 }
671
672 EXTERN_C_END
673
674 static napi_module demoModule = {
675 .nm_version = 1,
676 .nm_flags = 0,
677 .nm_filename = nullptr,
678 .nm_register_func = Init,
679 .nm_modname = "signal",
680 .nm_priv = ((void *)0),
681 .reserved = {0},
682 };
683
RegisterEntryModule(void)684 extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }
685