• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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