The OpenD Programming Language

1 /**
2  * D header file for POSIX.
3  *
4  * Copyright: Copyright Sean Kelly 2005 - 2009.
5  * License:   $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
6  * Authors:   Sean Kelly,
7               Alex Rønne Petersen
8  * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
9  * Source:    $(DRUNTIMESRC core/sys/posix/_signal.d)
10  */
11 
12 module core.sys.posix.signal;
13 
14 import core.sys.posix.config;
15 public import core.stdc.signal;
16 public import core.sys.posix.sys.types; // for pid_t
17 public import core.sys.posix.time; // for timespec
18 
19 version (OSX)
20     version = Darwin;
21 else version (iOS)
22     version = Darwin;
23 else version (TVOS)
24     version = Darwin;
25 else version (WatchOS)
26     version = Darwin;
27 
28 version (ARM)     version = ARM_Any;
29 version (AArch64) version = ARM_Any;
30 version (HPPA)    version = HPPA_Any;
31 version (MIPS32)  version = MIPS_Any;
32 version (MIPS64)  version = MIPS_Any;
33 version (PPC)     version = PPC_Any;
34 version (PPC64)   version = PPC_Any;
35 version (RISCV32) version = RISCV_Any;
36 version (RISCV64) version = RISCV_Any;
37 version (S390)    version = IBMZ_Any;
38 version (SPARC)   version = SPARC_Any;
39 version (SPARC64) version = SPARC_Any;
40 version (SystemZ) version = IBMZ_Any;
41 version (X86)     version = X86_Any;
42 version (X86_64)  version = X86_Any;
43 
44 version (Posix):
45 extern (C):
46 //nothrow:  // this causes http://issues.dlang.org/show_bug.cgi?id=12738 (which has been fixed)
47 //@system:
48 
49 //
50 // Required
51 //
52 /*
53 SIG_DFL (defined in core.stdc.signal)
54 SIG_ERR (defined in core.stdc.signal)
55 SIG_IGN (defined in core.stdc.signal)
56 
57 sig_atomic_t (defined in core.stdc.signal)
58 
59 SIGEV_NONE
60 SIGEV_SIGNAL
61 SIGEV_THREAD
62 
63 union sigval
64 {
65     int   sival_int;
66     void* sival_ptr;
67 }
68 
69 SIGRTMIN
70 SIGRTMAX
71 
72 SIGABRT (defined in core.stdc.signal)
73 SIGALRM
74 SIGBUS
75 SIGCHLD
76 SIGCONT
77 SIGFPE (defined in core.stdc.signal)
78 SIGHUP
79 SIGILL (defined in core.stdc.signal)
80 SIGINT (defined in core.stdc.signal)
81 SIGKILL
82 SIGPIPE
83 SIGQUIT
84 SIGSEGV (defined in core.stdc.signal)
85 SIGSTOP
86 SIGTERM (defined in core.stdc.signal)
87 SIGTSTP
88 SIGTTIN
89 SIGTTOU
90 SIGUSR1
91 SIGUSR2
92 SIGURG
93 
94 struct sigaction_t
95 {
96     sigfn_t     sa_handler;
97     sigset_t    sa_mask;
98     sigactfn_t  sa_sigaction;
99 }
100 
101 sigfn_t signal(int sig, sigfn_t func); (defined in core.stdc.signal)
102 int raise(int sig);                    (defined in core.stdc.signal)
103 */
104 
105 //SIG_DFL (defined in core.stdc.signal)
106 //SIG_ERR (defined in core.stdc.signal)
107 //SIG_IGN (defined in core.stdc.signal)
108 
109 //sig_atomic_t (defined in core.stdc.signal)
110 
111 private alias void function(int) sigfn_t;
112 private alias void function(int, siginfo_t*, void*) sigactfn_t;
113 
114 // nothrow versions
115 nothrow @nogc
116 {
117     private alias void function(int) sigfn_t2;
118     private alias void function(int, siginfo_t*, void*) sigactfn_t2;
119 }
120 
121 enum
122 {
123   SIGEV_SIGNAL,
124   SIGEV_NONE,
125   SIGEV_THREAD
126 }
127 
128 union sigval
129 {
130     int     sival_int;
131     void*   sival_ptr;
132 }
133 
134 version (Solaris)
135 {
136     import core.sys.posix.unistd;
137 
138     @property int SIGRTMIN() nothrow @nogc {
139         __gshared static int sig = -1;
140         if (sig == -1) {
141             sig = cast(int)sysconf(_SC_SIGRT_MIN);
142         }
143         return sig;
144     }
145 
146     @property int SIGRTMAX() nothrow @nogc {
147         __gshared static int sig = -1;
148         if (sig == -1) {
149             sig = cast(int)sysconf(_SC_SIGRT_MAX);
150         }
151         return sig;
152     }
153 }
154 else version (FreeBSD)
155 {
156     // Note: it appears that FreeBSD (prior to 7) and OSX do not support realtime signals
157     // https://github.com/freebsd/freebsd/blob/e79c62ff68fc74d88cb6f479859f6fae9baa5101/sys/sys/signal.h#L117
158     enum SIGRTMIN = 65;
159     enum SIGRTMAX = 126;
160 }
161 else version (DragonFlyBSD)
162 {
163     enum SIGRTMIN = 35;
164     enum SIGRTMAX = 126;
165 }
166 else version (NetBSD)
167 {
168     enum SIGRTMIN = 33;
169     enum SIGRTMAX = 63;
170 }
171 else version (linux)
172 {
173     // Note: CRuntime_Bionic switched to calling these functions
174     // since Lollipop, and Glibc, UClib and Musl all implement them
175     // the same way since it's part of LSB.
176     private extern (C) nothrow @nogc
177     {
178         int __libc_current_sigrtmin();
179         int __libc_current_sigrtmax();
180     }
181 
182     @property int SIGRTMIN() nothrow @nogc @system {
183         __gshared static int sig = -1;
184         if (sig == -1) {
185             sig = __libc_current_sigrtmin();
186         }
187         return sig;
188     }
189 
190     @property int SIGRTMAX() nothrow @nogc @system {
191         __gshared static int sig = -1;
192         if (sig == -1) {
193             sig = __libc_current_sigrtmax();
194         }
195         return sig;
196     }
197 }
198 
199 version (linux)
200 {
201     version (X86_Any)
202     {
203         //SIGABRT (defined in core.stdc.signal)
204         enum SIGALRM    = 14;
205         enum SIGBUS     = 7;
206         enum SIGCHLD    = 17;
207         enum SIGCONT    = 18;
208         //SIGFPE (defined in core.stdc.signal)
209         enum SIGHUP     = 1;
210         //SIGILL (defined in core.stdc.signal)
211         //SIGINT (defined in core.stdc.signal)
212         enum SIGKILL    = 9;
213         enum SIGPIPE    = 13;
214         enum SIGQUIT    = 3;
215         //SIGSEGV (defined in core.stdc.signal)
216         enum SIGSTOP    = 19;
217         //SIGTERM (defined in core.stdc.signal)
218         enum SIGTSTP    = 20;
219         enum SIGTTIN    = 21;
220         enum SIGTTOU    = 22;
221         enum SIGUSR1    = 10;
222         enum SIGUSR2    = 12;
223         enum SIGURG     = 23;
224     }
225     else version (HPPA_Any)
226     {
227         //SIGABRT (defined in core.stdc.signal)
228         enum SIGALRM    = 14;
229         enum SIGBUS     = 10;
230         enum SIGCHLD    = 18;
231         enum SIGCONT    = 26;
232         //SIGFPE (defined in core.stdc.signal)
233         enum SIGHUP     = 1;
234         //SIGILL (defined in core.stdc.signal)
235         //SIGINT (defined in core.stdc.signal)
236         enum SIGKILL    = 9;
237         enum SIGPIPE    = 13;
238         enum SIGQUIT    = 3;
239         //SIGSEGV (defined in core.stdc.signal)
240         enum SIGSTOP    = 24;
241         //SIGTERM (defined in core.stdc.signal)
242         enum SIGTSTP    = 25;
243         enum SIGTTIN    = 27;
244         enum SIGTTOU    = 28;
245         enum SIGUSR1    = 16;
246         enum SIGUSR2    = 17;
247         enum SIGURG     = 29;
248     }
249     else version (MIPS_Any)
250     {
251         //SIGABRT (defined in core.stdc.signal)
252         enum SIGALRM    = 14;
253         enum SIGBUS     = 10;
254         enum SIGCHLD    = 18;
255         enum SIGCONT    = 25;
256         //SIGFPE (defined in core.stdc.signal)
257         enum SIGHUP     = 1;
258         //SIGILL (defined in core.stdc.signal)
259         //SIGINT (defined in core.stdc.signal)
260         enum SIGKILL    = 9;
261         enum SIGPIPE    = 13;
262         enum SIGQUIT    = 3;
263         //SIGSEGV (defined in core.stdc.signal)
264         enum SIGSTOP    = 23;
265         //SIGTERM (defined in core.stdc.signal)
266         enum SIGTSTP    = 24;
267         enum SIGTTIN    = 26;
268         enum SIGTTOU    = 27;
269         enum SIGUSR1    = 16;
270         enum SIGUSR2    = 17;
271         enum SIGURG     = 21;
272     }
273     else version (PPC_Any)
274     {
275         //SIGABRT (defined in core.stdc.signal)
276         enum SIGALRM    = 14;
277         enum SIGBUS     = 7;
278         enum SIGCHLD    = 17;
279         enum SIGCONT    = 18;
280         //SIGFPE (defined in core.stdc.signal)
281         enum SIGHUP     = 1;
282         //SIGILL (defined in core.stdc.signal)
283         //SIGINT (defined in core.stdc.signal)
284         enum SIGKILL    = 9;
285         enum SIGPIPE    = 13;
286         enum SIGQUIT    = 3;
287         //SIGSEGV (defined in core.stdc.signal)
288         enum SIGSTOP    = 19;
289         //SIGTERM (defined in core.stdc.signal)
290         enum SIGTSTP    = 20;
291         enum SIGTTIN    = 21;
292         enum SIGTTOU    = 22;
293         enum SIGUSR1    = 10;
294         enum SIGUSR2    = 12;
295         enum SIGURG     = 23;
296     }
297     else version (ARM_Any)
298     {
299         //SIGABRT (defined in core.stdc.signal)
300         enum SIGALRM    = 14;
301         enum SIGBUS     = 7;
302         enum SIGCHLD    = 17;
303         enum SIGCONT    = 18;
304         //SIGFPE (defined in core.stdc.signal)
305         enum SIGHUP     = 1;
306         //SIGILL (defined in core.stdc.signal)
307         //SIGINT (defined in core.stdc.signal)
308         enum SIGKILL    = 9;
309         enum SIGPIPE    = 13;
310         enum SIGQUIT    = 3;
311         //SIGSEGV (defined in core.stdc.signal)
312         enum SIGSTOP    = 19;
313         //SIGTERM (defined in core.stdc.signal)
314         enum SIGTSTP    = 20;
315         enum SIGTTIN    = 21;
316         enum SIGTTOU    = 22;
317         enum SIGUSR1    = 10;
318         enum SIGUSR2    = 12;
319         enum SIGURG     = 23;
320     }
321     else version (RISCV_Any)
322     {
323         //SIGABRT (defined in core.stdc.signal)
324         enum SIGALRM    = 14;
325         enum SIGBUS     = 7;
326         enum SIGCHLD    = 17;
327         enum SIGCONT    = 18;
328         //SIGFPE (defined in core.stdc.signal)
329         enum SIGHUP     = 1;
330         //SIGILL (defined in core.stdc.signal)
331         //SIGINT (defined in core.stdc.signal)
332         enum SIGKILL    = 9;
333         enum SIGPIPE    = 13;
334         enum SIGQUIT    = 3;
335         //SIGSEGV (defined in core.stdc.signal)
336         enum SIGSTOP    = 19;
337         //SIGTERM (defined in core.stdc.signal)
338         enum SIGTSTP    = 20;
339         enum SIGTTIN    = 21;
340         enum SIGTTOU    = 22;
341         enum SIGUSR1    = 10;
342         enum SIGUSR2    = 12;
343         enum SIGURG     = 23;
344     }
345     else version (SPARC_Any)
346     {
347         //SIGABRT (defined in core.stdc.signal)
348         enum SIGALRM    = 14;
349         enum SIGBUS     = 10;
350         enum SIGCHLD    = 20;
351         enum SIGCONT    = 19;
352         //SIGFPE (defined in core.stdc.signal)
353         enum SIGHUP     = 1;
354         //SIGILL (defined in core.stdc.signal)
355         //SIGINT (defined in core.stdc.signal)
356         enum SIGKILL    = 9;
357         enum SIGPIPE    = 13;
358         enum SIGQUIT    = 3;
359         //SIGSEGV (defined in core.stdc.signal)
360         enum SIGSTOP    = 17;
361         //SIGTERM (defined in core.stdc.signal)
362         enum SIGTSTP    = 18;
363         enum SIGTTIN    = 21;
364         enum SIGTTOU    = 22;
365         enum SIGUSR1    = 30;
366         enum SIGUSR2    = 31;
367         enum SIGURG     = 16;
368     }
369     else version (IBMZ_Any)
370     {
371         //SIGABRT (defined in core.stdc.signal)
372         enum SIGALRM    = 14;
373         enum SIGBUS     = 7;
374         enum SIGCHLD    = 17;
375         enum SIGCONT    = 18;
376         //SIGFPE (defined in core.stdc.signal)
377         enum SIGHUP     = 1;
378         //SIGILL (defined in core.stdc.signal)
379         //SIGINT (defined in core.stdc.signal)
380         enum SIGKILL    = 9;
381         enum SIGPIPE    = 13;
382         enum SIGQUIT    = 3;
383         //SIGSEGV (defined in core.stdc.signal)
384         enum SIGSTOP    = 19;
385         //SIGTERM (defined in core.stdc.signal)
386         enum SIGTSTP    = 20;
387         enum SIGTTIN    = 21;
388         enum SIGTTOU    = 22;
389         enum SIGUSR1    = 10;
390         enum SIGUSR2    = 12;
391         enum SIGURG     = 23;
392     }
393     else version (LoongArch64)
394     {
395         //SIGABRT (defined in core.stdc.signal)
396         enum SIGALRM    = 14;
397         enum SIGBUS     = 7;
398         enum SIGCHLD    = 17;
399         enum SIGCONT    = 18;
400         //SIGFPE (defined in core.stdc.signal)
401         enum SIGHUP     = 1;
402         //SIGILL (defined in core.stdc.signal)
403         //SIGINT (defined in core.stdc.signal)
404         enum SIGKILL    = 9;
405         enum SIGPIPE    = 13;
406         enum SIGQUIT    = 3;
407         //SIGSEGV (defined in core.stdc.signal)
408         enum SIGSTOP    = 19;
409         //SIGTERM (defined in core.stdc.signal)
410         enum SIGTSTP    = 20;
411         enum SIGTTIN    = 21;
412         enum SIGTTOU    = 22;
413         enum SIGUSR1    = 10;
414         enum SIGUSR2    = 12;
415         enum SIGURG     = 23;
416     }
417     else version (WebAssembly)
418     {
419     	// FIXME: verify
420         //SIGABRT (defined in core.stdc.signal)
421         enum SIGALRM    = 14;
422         enum SIGBUS     = 7;
423         enum SIGCHLD    = 17;
424         enum SIGCONT    = 18;
425         //SIGFPE (defined in core.stdc.signal)
426         enum SIGHUP     = 1;
427         //SIGILL (defined in core.stdc.signal)
428         //SIGINT (defined in core.stdc.signal)
429         enum SIGKILL    = 9;
430         enum SIGPIPE    = 13;
431         enum SIGQUIT    = 3;
432         //SIGSEGV (defined in core.stdc.signal)
433         enum SIGSTOP    = 19;
434         //SIGTERM (defined in core.stdc.signal)
435         enum SIGTSTP    = 20;
436         enum SIGTTIN    = 21;
437         enum SIGTTOU    = 22;
438         enum SIGUSR1    = 10;
439         enum SIGUSR2    = 12;
440         enum SIGURG     = 23;
441     }
442 
443     else
444         static assert(0, "unimplemented");
445 }
446 else version (Darwin)
447 {
448     //SIGABRT (defined in core.stdc.signal)
449     enum SIGALRM    = 14;
450     enum SIGBUS     = 10;
451     enum SIGCHLD    = 20;
452     enum SIGCONT    = 19;
453     //SIGFPE (defined in core.stdc.signal)
454     enum SIGHUP     = 1;
455     //SIGILL (defined in core.stdc.signal)
456     //SIGINT (defined in core.stdc.signal)
457     enum SIGKILL    = 9;
458     enum SIGPIPE    = 13;
459     enum SIGQUIT    = 3;
460     //SIGSEGV (defined in core.stdc.signal)
461     enum SIGSTOP    = 17;
462     //SIGTERM (defined in core.stdc.signal)
463     enum SIGTSTP    = 18;
464     enum SIGTTIN    = 21;
465     enum SIGTTOU    = 22;
466     enum SIGUSR1    = 30;
467     enum SIGUSR2    = 31;
468     enum SIGURG     = 16;
469 }
470 else version (FreeBSD)
471 {
472     //SIGABRT (defined in core.stdc.signal)
473     enum SIGALRM    = 14;
474     enum SIGBUS     = 10;
475     enum SIGCHLD    = 20;
476     enum SIGCONT    = 19;
477     //SIGFPE (defined in core.stdc.signal)
478     enum SIGHUP     = 1;
479     //SIGILL (defined in core.stdc.signal)
480     //SIGINT (defined in core.stdc.signal)
481     enum SIGKILL    = 9;
482     enum SIGPIPE    = 13;
483     enum SIGQUIT    = 3;
484     //SIGSEGV (defined in core.stdc.signal)
485     enum SIGSTOP    = 17;
486     //SIGTERM (defined in core.stdc.signal)
487     enum SIGTSTP    = 18;
488     enum SIGTTIN    = 21;
489     enum SIGTTOU    = 22;
490     enum SIGUSR1    = 30;
491     enum SIGUSR2    = 31;
492     enum SIGURG     = 16;
493 }
494 else version (NetBSD)
495 {
496     //SIGABRT (defined in core.stdc.signal)
497     enum SIGALRM    = 14;
498     enum SIGBUS     = 10;
499     enum SIGCHLD    = 20;
500     enum SIGCONT    = 19;
501     //SIGFPE (defined in core.stdc.signal)
502     enum SIGHUP     = 1;
503     //SIGILL (defined in core.stdc.signal)
504     //SIGINT (defined in core.stdc.signal)
505     enum SIGKILL    = 9;
506     enum SIGPIPE    = 13;
507     enum SIGQUIT    = 3;
508     //SIGSEGV (defined in core.stdc.signal)
509     enum SIGSTOP    = 17;
510     //SIGTERM (defined in core.stdc.signal)
511     enum SIGTSTP    = 18;
512     enum SIGTTIN    = 21;
513     enum SIGTTOU    = 22;
514     enum SIGUSR1    = 30;
515     enum SIGUSR2    = 31;
516     enum SIGURG     = 16;
517 }
518 else version (OpenBSD)
519 {
520     //SIGABRT (defined in core.stdc.signal)
521     enum SIGALRM    = 14;
522     enum SIGBUS     = 10;
523     enum SIGCHLD    = 20;
524     enum SIGCONT    = 19;
525     //SIGFPE (defined in core.stdc.signal)
526     enum SIGHUP     = 1;
527     //SIGILL (defined in core.stdc.signal)
528     //SIGINT (defined in core.stdc.signal)
529     enum SIGKILL    = 9;
530     enum SIGPIPE    = 13;
531     enum SIGQUIT    = 3;
532     //SIGSEGV (defined in core.stdc.signal)
533     enum SIGSTOP    = 17;
534     //SIGTERM (defined in core.stdc.signal)
535     enum SIGTSTP    = 18;
536     enum SIGTTIN    = 21;
537     enum SIGTTOU    = 22;
538     enum SIGUSR1    = 30;
539     enum SIGUSR2    = 31;
540     enum SIGURG     = 16;
541 }
542 else version (DragonFlyBSD)
543 {
544     //SIGABRT (defined in core.stdc.signal)
545     enum SIGALRM    = 14;
546     enum SIGBUS     = 10;
547     enum SIGCHLD    = 20;
548     enum SIGCONT    = 19;
549     //SIGFPE (defined in core.stdc.signal)
550     enum SIGHUP     = 1;
551     //SIGILL (defined in core.stdc.signal)
552     //SIGINT (defined in core.stdc.signal)
553     enum SIGKILL    = 9;
554     enum SIGPIPE    = 13;
555     enum SIGQUIT    = 3;
556     //SIGSEGV (defined in core.stdc.signal)
557     enum SIGSTOP    = 17;
558     //SIGTERM (defined in core.stdc.signal)
559     enum SIGTSTP    = 18;
560     enum SIGTTIN    = 21;
561     enum SIGTTOU    = 22;
562     enum SIGUSR1    = 30;
563     enum SIGUSR2    = 31;
564     enum SIGURG     = 16;
565 }
566 else version (Solaris)
567 {
568     //SIGABRT (defined in core.stdc.signal)
569     enum SIGALRM = 14;
570     enum SIGBUS = 10;
571     enum SIGCHLD = 18;
572     enum SIGCONT = 25;
573     //SIGFPE (defined in core.stdc.signal)
574     enum SIGHUP = 1;
575     //SIGILL (defined in core.stdc.signal)
576     //SIGINT (defined in core.stdc.signal)
577     enum SIGKILL = 9;
578     enum SIGPIPE = 13;
579     enum SIGQUIT = 3;
580     //SIGSEGV (defined in core.stdc.signal)
581     enum SIGSTOP = 23;
582     //SIGTERM (defined in core.stdc.signal)
583     enum SIGTSTP = 24;
584     enum SIGTTIN = 26;
585     enum SIGTTOU = 27;
586     enum SIGUSR1 = 16;
587     enum SIGUSR2 = 17;
588     enum SIGURG = 21;
589 }
590 else
591 {
592     static assert(false, "Unsupported platform");
593 }
594 
595 version (linux)
596 {
597     version (CRuntime_Musl)
598     {
599         struct sigaction_t
600         {
601             union
602             {
603                 sigfn_t     sa_handler;
604                 sigactfn_t  sa_sigaction;
605             }
606             sigset_t        sa_mask;
607             int             sa_flags;
608             void function() sa_restorer;
609         }
610     }
611     else version (CRuntime_Bionic)
612     {
613         version (D_LP64)
614         {
615             struct sigaction_t
616             {
617                 int            sa_flags;
618                 union
619                 {
620                     sigfn_t    sa_handler;
621                     sigactfn_t sa_sigaction;
622                 }
623                 sigset_t        sa_mask;
624                 void function() sa_restorer;
625         }
626         }
627         else
628         {
629             struct sigaction_t
630             {
631                 union
632                 {
633                     sigfn_t    sa_handler;
634                     sigactfn_t sa_sigaction;
635                 }
636                 sigset_t        sa_mask;
637                 int             sa_flags;
638                 void function() sa_restorer;
639             }
640         }
641     }
642     else version (SystemZ)
643     {
644         struct sigaction_t
645         {
646             static if ( true /* __USE_POSIX199309 */ )
647             {
648                 union
649                 {
650                     sigfn_t     sa_handler;
651                     sigactfn_t  sa_sigaction;
652                 }
653             }
654             else
655             {
656                 sigfn_t     sa_handler;
657             }
658             version (CRuntime_Glibc)
659             {
660                 int         __glibc_reserved0;
661                 int         sa_flags;
662             }
663             else
664             {
665                 c_ulong     sa_flags;
666             }
667 
668             void function() sa_restorer;
669 
670             sigset_t        sa_mask;
671         }
672     }
673     else version (HPPA_Any)
674     {
675         struct sigaction_t
676         {
677             static if ( true /* __USE_POSIX199309 */ )
678             {
679                 union
680                 {
681                     sigfn_t     sa_handler;
682                     sigactfn_t  sa_sigaction;
683                 }
684             }
685             else
686             {
687                 sigfn_t     sa_handler;
688             }
689             version (CRuntime_Glibc)
690             {
691                 version (D_LP64)
692                     int     __glibc_reserved0;
693                 int         sa_flags;
694             }
695             else
696             {
697                 c_ulong     sa_flags;
698             }
699             sigset_t        sa_mask;
700         }
701     }
702     else version (MIPS_Any)
703     {
704         struct sigaction_t
705         {
706             int sa_flags;
707 
708             static if ( true /* __USE_POSIX199309 */ )
709             {
710                 union
711                 {
712                     sigfn_t     sa_handler;
713                     sigactfn_t  sa_sigaction;
714                 }
715             }
716             else
717             {
718                 sigfn_t     sa_handler;
719             }
720             sigset_t        sa_mask;
721             void function() sa_restorer;
722 
723             version (CRuntime_Glibc)
724             {
725                 static if ((void*).sizeof < 8)
726                     int[1]  sa_resv;
727             }
728         }
729     }
730     else version (SPARC_Any)
731     {
732         struct sigaction_t
733         {
734             static if ( true /* __USE_POSIX199309 */ )
735             {
736                 union
737                 {
738                     sigfn_t     sa_handler;
739                     sigactfn_t  sa_sigaction;
740                 }
741             }
742             else
743             {
744                 sigfn_t     sa_handler;
745             }
746             version (CRuntime_Glibc)
747             {
748                 sigset_t    sa_mask;
749                 version (D_LP64)
750                     int     __glibc_reserved0;
751                 int         sa_flags;
752                 void function() sa_restorer;
753             }
754             else
755             {
756                 c_ulong     sa_flags;
757                 void function() sa_restorer;
758                 sigset_t    sa_mask;
759             }
760         }
761     }
762     else
763     {
764         struct sigaction_t
765         {
766             static if ( true /* __USE_POSIX199309 */ )
767             {
768                 union
769                 {
770                     sigfn_t     sa_handler;
771                     sigactfn_t  sa_sigaction;
772                 }
773             }
774             else
775             {
776                 sigfn_t     sa_handler;
777             }
778             sigset_t        sa_mask;
779             int             sa_flags;
780 
781             void function() sa_restorer;
782         }
783     }
784 }
785 else version (FreeBSD)
786 {
787     struct sigaction_t
788     {
789         union
790         {
791             sigfn_t     sa_handler;
792             sigactfn_t  sa_sigaction;
793         }
794         int      sa_flags;
795         sigset_t sa_mask;
796     }
797 }
798 else version (NetBSD)
799 {
800     struct sigaction_t
801     {
802         union
803         {
804             sigfn_t     sa_handler;
805             sigactfn_t  sa_sigaction;
806         }
807         sigset_t sa_mask;
808         int      sa_flags;
809     }
810 }
811 else version (OpenBSD)
812 {
813     struct sigaction_t
814     {
815         union
816         {
817             sigfn_t     __sa_handler;
818             alias sa_handler = __sa_handler;
819             sigactfn_t  __sa_sigaction;
820             alias sa_sigaction = __sa_sigaction;
821         }
822         sigset_t sa_mask;
823         int      sa_flags;
824     }
825 }
826 else version (DragonFlyBSD)
827 {
828     struct sigaction_t
829     {
830         union
831         {
832             sigfn_t     sa_handler;
833             sigactfn_t  sa_sigaction;
834         }
835         int      sa_flags;
836         sigset_t sa_mask;
837     }
838 }
839 else version (Solaris)
840 {
841     struct sigaction_t
842     {
843         int sa_flags;
844 
845         union
846         {
847             sigfn_t sa_handler;
848             sigactfn_t sa_sigaction;
849         }
850 
851         sigset_t sa_mask;
852         version (D_LP64) {}
853         else
854             int[2] sa_resv;
855     }
856 }
857 else version (Darwin)
858 {
859     struct sigaction_t
860     {
861         static if ( true /* __USE_POSIX199309 */ )
862         {
863             union
864             {
865                 sigfn_t     sa_handler;
866                 sigactfn_t  sa_sigaction;
867             }
868         }
869         else
870         {
871             sigfn_t     sa_handler;
872         }
873         sigset_t        sa_mask;
874         int             sa_flags;
875     }
876 }
877 else
878 {
879     static assert(false, "Unsupported platform");
880 }
881 
882 //
883 // C Extension (CX)
884 //
885 /*
886 SIG_HOLD
887 
888 sigset_t
889 pid_t   (defined in core.sys.types)
890 
891 SIGABRT (defined in core.stdc.signal)
892 SIGFPE  (defined in core.stdc.signal)
893 SIGILL  (defined in core.stdc.signal)
894 SIGINT  (defined in core.stdc.signal)
895 SIGSEGV (defined in core.stdc.signal)
896 SIGTERM (defined in core.stdc.signal)
897 
898 SA_NOCLDSTOP (CX|XSI)
899 SIG_BLOCK
900 SIG_UNBLOCK
901 SIG_SETMASK
902 
903 struct siginfo_t
904 {
905     int     si_signo;
906     int     si_code;
907 
908     version (XSI)
909     {
910         int     si_errno;
911         pid_t   si_pid;
912         uid_t   si_uid;
913         void*   si_addr;
914         int     si_status;
915         c_long  si_band;
916     }
917     version (RTS)
918     {
919         sigval  si_value;
920     }
921 }
922 
923 SI_USER
924 SI_QUEUE
925 SI_TIMER
926 SI_ASYNCIO
927 SI_MESGQ
928 */
929 
930 nothrow @nogc
931 {
932 
933 version (linux)
934 {
935     enum SIG_HOLD = cast(sigfn_t2) 2;
936 
937     private enum _SIGSET_NWORDS = 1024 / (8 * c_ulong.sizeof);
938 
939     struct sigset_t
940     {
941         c_ulong[_SIGSET_NWORDS] __val;
942     }
943 
944     enum SA_NOCLDSTOP   = 1; // (CX|XSI)
945 
946     version (MIPS_Any)
947     {
948         enum SIG_BLOCK      = 1;
949         enum SIG_UNBLOCK    = 2;
950         enum SIG_SETMASK    = 3;
951     }
952     else version (SPARC_Any)
953     {
954         enum SIG_BLOCK      = 1;
955         enum SIG_UNBLOCK    = 2;
956         enum SIG_SETMASK    = 4;
957     }
958     else
959     {
960         enum SIG_BLOCK      = 0;
961         enum SIG_UNBLOCK    = 1;
962         enum SIG_SETMASK    = 2;
963     }
964 
965     private enum __SI_MAX_SIZE = 128;
966 
967     static if ( __WORDSIZE == 64 )
968     {
969         private enum __SI_PAD_SIZE = ((__SI_MAX_SIZE / int.sizeof) - 4);
970     }
971     else
972     {
973         private enum __SI_PAD_SIZE = ((__SI_MAX_SIZE / int.sizeof) - 3);
974     }
975 
976     struct siginfo_t
977     {
978         int si_signo;
979         version (MIPS_Any)  // __SI_SWAP_ERRNO_CODE
980         {
981             int si_code;
982             int si_errno;
983         }
984         else
985         {
986             int si_errno;
987             int si_code;
988         }
989 
990         union _sifields_t
991         {
992             int[__SI_PAD_SIZE] _pad;
993 
994             // kill()
995             struct _kill_t
996             {
997                 pid_t si_pid;
998                 uid_t si_uid;
999             } _kill_t _kill;
1000             // POSIX.1b timers.
1001             struct _timer_t
1002             {
1003                 int    si_tid;
1004                 int    si_overrun;
1005                 sigval si_sigval;
1006             } _timer_t _timer;
1007 
1008             // POSIX.1b signals
1009             struct _rt_t
1010             {
1011                 pid_t  si_pid;
1012                 uid_t  si_uid;
1013                 sigval si_sigval;
1014             } _rt_t _rt;
1015 
1016             // SIGCHLD
1017             struct _sigchild_t
1018             {
1019                 pid_t   si_pid;
1020                 uid_t   si_uid;
1021                 int     si_status;
1022                 clock_t si_utime;
1023                 clock_t si_stime;
1024             } _sigchild_t _sigchld;
1025 
1026             // SIGILL, SIGFPE, SIGSEGV, SIGBUS
1027             struct _sigfault_t
1028             {
1029                 void*     si_addr;
1030             } _sigfault_t _sigfault;
1031 
1032             // SIGPOLL
1033             struct _sigpoll_t
1034             {
1035                 c_long   si_band;
1036                 int      si_fd;
1037             } _sigpoll_t _sigpoll;
1038         } _sifields_t _sifields;
1039 
1040     nothrow @nogc:
1041         @property ref pid_t si_pid() return { return _sifields._kill.si_pid; }
1042         @property ref uid_t si_uid() return { return _sifields._kill.si_uid; }
1043         @property ref void* si_addr() return { return _sifields._sigfault.si_addr; }
1044         @property ref int si_status() return { return _sifields._sigchld.si_status; }
1045         @property ref c_long si_band() return { return _sifields._sigpoll.si_band; }
1046         @property ref sigval si_value() return { return _sifields._rt.si_sigval; }
1047     }
1048 
1049     enum
1050     {
1051         SI_ASYNCNL = -60,
1052         SI_TKILL   = -6,
1053         SI_SIGIO,
1054         SI_ASYNCIO,
1055         SI_MESGQ,
1056         SI_TIMER,
1057         SI_QUEUE,
1058         SI_USER,
1059         SI_KERNEL  = 0x80
1060     }
1061 }
1062 else version (Darwin)
1063 {
1064     enum SIG_HOLD = cast(sigfn_t2) 5;
1065 
1066     alias uint sigset_t;
1067 
1068     enum SA_NOCLDSTOP = 8; // (CX|XSI)
1069 
1070     enum SIG_BLOCK   = 1;
1071     enum SIG_UNBLOCK = 2;
1072     enum SIG_SETMASK = 3;
1073 
1074     struct siginfo_t
1075     {
1076         int     si_signo;
1077         int     si_errno;
1078         int     si_code;
1079         pid_t   si_pid;
1080         uid_t   si_uid;
1081         int     si_status;
1082         void*   si_addr;
1083         sigval  si_value;
1084         int     si_band;
1085         uint[7] pad;
1086     }
1087 
1088     enum SI_USER    = 0x10001;
1089     enum SI_QUEUE   = 0x10002;
1090     enum SI_TIMER   = 0x10003;
1091     enum SI_ASYNCIO = 0x10004;
1092     enum SI_MESGQ   = 0x10005;
1093 }
1094 else version (FreeBSD)
1095 {
1096     enum SIG_HOLD = cast(sigfn_t2) 3;
1097 
1098     struct sigset_t
1099     {
1100         uint[4] __bits;
1101     }
1102 
1103     enum SA_NOCLDSTOP = 8;
1104 
1105     enum SIG_BLOCK = 1;
1106     enum SIG_UNBLOCK = 2;
1107     enum SIG_SETMASK = 3;
1108 
1109     struct siginfo_t
1110     {
1111         int si_signo;
1112         int si_errno;
1113         int si_code;
1114         pid_t si_pid;
1115         uid_t si_uid;
1116         int si_status;
1117         void* si_addr;
1118         sigval si_value;
1119         union __reason
1120         {
1121             struct __fault
1122             {
1123                 int _trapno;
1124             }
1125             __fault _fault;
1126             struct __timer
1127             {
1128                 int _timerid;
1129                 int _overrun;
1130             }
1131             __timer _timer;
1132             struct __mesgq
1133             {
1134                 int _mqd;
1135             }
1136             __mesgq _mesgq;
1137             struct __poll
1138             {
1139                 c_long _band;
1140             }
1141             __poll _poll;
1142             struct ___spare___
1143             {
1144                 c_long __spare1__;
1145                 int[7] __spare2__;
1146             }
1147             ___spare___ __spare__;
1148         }
1149         __reason _reason;
1150 
1151         @property ref c_long si_band() return { return _reason._poll._band; }
1152     }
1153 
1154     enum SI_USER    = 0x10001;
1155     enum SI_QUEUE   = 0x10002;
1156     enum SI_TIMER   = 0x10003;
1157     enum SI_ASYNCIO = 0x10004;
1158     enum SI_MESGQ   = 0x10005;
1159 }
1160 else version (NetBSD)
1161 {
1162     enum SIG_HOLD = cast(sigfn_t2) 3;
1163 
1164     struct sigset_t
1165     {
1166         uint[4] __bits;
1167     }
1168 
1169     enum SA_NOCLDSTOP = 8;
1170 
1171     enum SIG_BLOCK = 1;
1172     enum SIG_UNBLOCK = 2;
1173     enum SIG_SETMASK = 3;
1174 
1175     union sigval_t
1176     {
1177         int   sival_int;
1178         void* sival_ptr;
1179     }
1180 
1181     struct _ksiginfo
1182     {
1183         int     _signo;
1184         int     _code;
1185         int     _errno;
1186         version (D_LP64)
1187             int _pad;
1188 
1189         union reason_t
1190         {
1191             struct rt_t
1192             {
1193                 pid_t    _pid;
1194                 uid_t    _uid;
1195                 sigval_t _value;
1196             } rt_t _rt;
1197             struct child_t
1198             {
1199                 pid_t   _pid;
1200                 uid_t   _uid;
1201                 int     _status;
1202                 clock_t _utime;
1203                 clock_t _stime;
1204             } child_t _child;
1205             struct fault_t
1206             {
1207                 void* _addr;
1208                 int   _trap;
1209                 int   _trap2;
1210                 int   _trap3;
1211             } fault_t fault;
1212             struct poll_t
1213             {
1214                 c_long _band;
1215                 int  _fd;
1216             } poll_t _poll;
1217         }
1218         reason_t _reason;
1219     }
1220 
1221     union siginfo_t
1222     {
1223         ubyte[128] si_pad;
1224         _ksiginfo _info;
1225         @property ref c_long si_band() return { return _info._reason._poll._band; }
1226     }
1227 
1228     enum SI_USER    = 0;
1229     enum SI_QUEUE   = -1;
1230     enum SI_TIMER   = -2;
1231     enum SI_ASYNCIO = -3;
1232     enum SI_MESGQ   = -4;
1233 }
1234 else version (OpenBSD)
1235 {
1236     enum SIG_CATCH = cast(sigfn_t2) 2;
1237     enum SIG_HOLD = cast(sigfn_t2) 3;
1238 
1239     alias sigset_t = uint;
1240 
1241     enum SA_NOCLDSTOP = 0x0008;
1242 
1243     enum SIG_BLOCK = 1;
1244     enum SIG_UNBLOCK = 2;
1245     enum SIG_SETMASK = 3;
1246 
1247     private enum SI_MAXSZ = 128;
1248     private enum SI_PAD = (SI_MAXSZ / int.sizeof) - 3;
1249 
1250     struct siginfo_t
1251     {
1252         int si_signo;
1253         int si_errno;
1254         int si_code;
1255         union _data
1256         {
1257             int[SI_PAD] _pad;
1258             struct _proc
1259             {
1260                 pid_t _pid;
1261                 union _pdata
1262                 {
1263                     struct _kill
1264                     {
1265                         uid_t _uid;
1266                         sigval _value;
1267                     }
1268                     struct _cld
1269                     {
1270                         clock_t _utime;
1271                         clock_t _stime;
1272                         int _status;
1273                     }
1274                 }
1275             }
1276             struct _fault
1277             {
1278                 caddr_t _addr;
1279                 int _trapno;
1280             }
1281         }
1282         alias si_pid     = _data._proc._pid;
1283         alias si_status  = _data._proc._pdata._cld._status;
1284         alias si_stime   = _data._proc._pdata._cld._stime;
1285         alias si_utime   = _data._proc._pdata._cld._utime;
1286         alias si_uid     = _data._proc._pdata._kill._uid;
1287         alias si_value   = _data._proc._pdata._kill._value;
1288         alias si_addr    = _data._fault._addr;
1289         alias si_trapno  = _data._fault._trapno;
1290     }
1291 
1292     enum SI_NOINFO = 32767;
1293     enum SI_USER   = 0;
1294     enum SI_LWP    = -1;
1295     enum SI_QUEUE  = -2;
1296     enum SI_TIMER  = -3;
1297 }
1298 else version (DragonFlyBSD)
1299 {
1300     enum SIG_CATCH = cast(sigfn_t2) 2;
1301     enum SIG_HOLD = cast(sigfn_t2) 3;
1302 
1303     struct sigset_t
1304     {
1305         uint[4] __bits;
1306     }
1307 
1308     enum SA_NOCLDSTOP = 8;
1309 
1310     enum SIG_BLOCK = 1;
1311     enum SIG_UNBLOCK = 2;
1312     enum SIG_SETMASK = 3;
1313 
1314     struct siginfo_t
1315     {
1316         int si_signo;
1317         int si_errno;
1318         int si_code;
1319         int si_pid;
1320         uint si_uid;
1321         int si_status;
1322         void* si_addr;
1323         sigval si_value;
1324         c_long si_band;
1325         int[7]   __spare;
1326     }
1327 
1328     enum SI_UNDEFINED = 0x00000;
1329     enum SI_USER      =  0;
1330     enum SI_QUEUE     = -1;
1331     enum SI_TIMER     = -2;
1332     enum SI_ASYNCIO   = -3;
1333     enum SI_MESGQ     = -4;
1334 }
1335 else version (Solaris)
1336 {
1337     enum SIG_HOLD = cast(sigfn_t2)2;
1338 
1339     struct sigset_t
1340     {
1341         uint[4] __bits;
1342     }
1343 
1344     enum SIG_BLOCK = 1;
1345     enum SIG_UNBLOCK = 2;
1346     enum SIG_SETMASK = 3;
1347 
1348     struct siginfo_t
1349     {
1350         int si_signo;
1351         int si_code;
1352         int si_errno;
1353 
1354         version (D_LP64)
1355             int si_pad;
1356 
1357         union ___data
1358         {
1359             version (D_LP64)
1360                 int[(256 / int.sizeof) - 4] si_pad;
1361             else
1362                 int[(128 / int.sizeof) - 3] si_pad;
1363 
1364             struct ___proc
1365             {
1366                 pid_t __pid;
1367 
1368                 union ___pdata
1369                 {
1370                     struct ___kill
1371                     {
1372                         uid_t __uid;
1373                         sigval __value;
1374                     }
1375 
1376                     ___kill __kill;
1377 
1378                     struct ___cld
1379                     {
1380                         clock_t __utime;
1381                         int __status;
1382                         clock_t __stime;
1383                     }
1384 
1385                     ___cld __cld;
1386                 }
1387 
1388                 ___pdata __pdata;
1389                 ctid_t __ctid;
1390                 zoneid_t __zoneid;
1391             }
1392 
1393             ___proc __proc;
1394 
1395             struct ___fault
1396             {
1397                 void* __addr;
1398                 int __trapno;
1399                 caddr_t __pc;
1400             }
1401 
1402             ___fault __fault;
1403 
1404             struct ___file
1405             {
1406                 int __fd;
1407                 c_long __band;
1408             }
1409 
1410             ___file __file;
1411 
1412             struct ___prof
1413             {
1414                 caddr_t __faddr;
1415                 timestruc_t __tstamp;
1416                 short __syscall;
1417                 char __nsysarg = 0;
1418                 char __fault = 0;
1419                 c_long[8] __sysarg;
1420                 int[10] __mstate;
1421             }
1422 
1423             ___prof __prof;
1424 
1425             struct ___rctl
1426             {
1427                 int __entity;
1428             }
1429 
1430             ___rctl __rctl;
1431         }
1432 
1433         ___data __data;
1434     }
1435 
1436     enum SI_NOINFO  = 32767;
1437     enum SI_DTRACE  = 2050;
1438     enum SI_RCTL    = 2049;
1439     enum SI_USER    = 0;
1440     enum SI_LWP     = -1;
1441     enum SI_QUEUE   = -2;
1442     enum SI_TIMER   = -3;
1443     enum SI_ASYNCIO = -4;
1444     enum SI_MESGQ   = -5;
1445 }
1446 else
1447 {
1448     static assert(false, "Unsupported platform");
1449 }
1450 
1451 /*
1452 int kill(pid_t, int);
1453 int sigaction(int, const scope sigaction_t*, sigaction_t*);
1454 int sigaddset(sigset_t*, int);
1455 int sigdelset(sigset_t*, int);
1456 int sigemptyset(sigset_t*);
1457 int sigfillset(sigset_t*);
1458 int sigismember(const scope sigset_t*, int);
1459 int sigpending(sigset_t*);
1460 int sigprocmask(int, const scope sigset_t*, sigset_t*);
1461 int sigsuspend(const scope sigset_t*);
1462 int sigwait(const scope sigset_t*, int*);
1463 */
1464 
1465 version (CRuntime_Glibc)
1466 {
1467     int kill(pid_t, int);
1468     int sigaction(int, const scope sigaction_t*, sigaction_t*);
1469     int sigaddset(sigset_t*, int);
1470     int sigdelset(sigset_t*, int);
1471     int sigemptyset(sigset_t*);
1472     int sigfillset(sigset_t*);
1473     int sigismember(const scope sigset_t*, int);
1474     int sigpending(sigset_t*);
1475     int sigprocmask(int, const scope sigset_t*, sigset_t*);
1476     int sigsuspend(const scope sigset_t*);
1477     int sigwait(const scope sigset_t*, int*);
1478 }
1479 else version (Darwin)
1480 {
1481     int kill(pid_t, int);
1482     int sigaction(int, const scope sigaction_t*, sigaction_t*);
1483     int sigaddset(sigset_t*, int);
1484     int sigdelset(sigset_t*, int);
1485     int sigemptyset(sigset_t*);
1486     int sigfillset(sigset_t*);
1487     int sigismember(const scope sigset_t*, int);
1488     int sigpending(sigset_t*);
1489     int sigprocmask(int, const scope sigset_t*, sigset_t*);
1490     int sigsuspend(const scope sigset_t*);
1491     int sigwait(const scope sigset_t*, int*);
1492 }
1493 else version (FreeBSD)
1494 {
1495     int kill(pid_t, int);
1496     int sigaction(int, const scope sigaction_t*, sigaction_t*);
1497     int sigaddset(sigset_t*, int);
1498     int sigdelset(sigset_t*, int);
1499     int sigemptyset(sigset_t *);
1500     int sigfillset(sigset_t *);
1501     int sigismember(const scope sigset_t*, int);
1502     int sigpending(sigset_t *);
1503     int sigprocmask(int, const scope sigset_t*, sigset_t*);
1504     int sigsuspend(const scope sigset_t*);
1505     int sigwait(const scope sigset_t*, int*);
1506 }
1507 else version (NetBSD)
1508 {
1509     int kill(pid_t, int);
1510     int __sigaction14(int, const scope sigaction_t*, sigaction_t*);
1511     int __sigaddset14(sigset_t*, int);
1512     int __sigdelset14(sigset_t*, int);
1513     int __sigemptyset14(sigset_t *);
1514     int __sigfillset14(sigset_t *);
1515     int __sigismember14(const scope sigset_t*, int);
1516     int __sigpending14(sigset_t *);
1517     int __sigprocmask14(int, const scope sigset_t*, sigset_t*);
1518     int __sigsuspend14(const scope sigset_t*);
1519     int sigwait(const scope sigset_t*, int*);
1520 
1521     alias __sigaction14 sigaction;
1522     alias __sigaddset14 sigaddset;
1523     alias __sigdelset14 sigdelset;
1524     alias __sigemptyset14 sigemptyset;
1525     alias __sigfillset14 sigfillset;
1526     alias __sigismember14 sigismember;
1527     alias __sigpending14 sigpending;
1528     alias __sigprocmask14 sigprocmask;
1529     alias __sigsuspend14 sigsuspend;
1530 }
1531 else version (OpenBSD)
1532 {
1533     int kill(pid_t, int);
1534     int sigaction(int, const scope sigaction_t*, sigaction_t*);
1535     int sigaddset(sigset_t*, int);
1536     int sigdelset(sigset_t*, int);
1537     int sigemptyset(sigset_t *);
1538     int sigfillset(sigset_t *);
1539     int sigismember(const scope sigset_t*, int);
1540     int sigpending(sigset_t *);
1541     int sigprocmask(int, const scope sigset_t*, sigset_t*);
1542     int sigsuspend(const scope sigset_t*);
1543     int sigwait(const scope sigset_t*, int*);
1544 }
1545 else version (DragonFlyBSD)
1546 {
1547     int kill(pid_t, int);
1548     int sigaction(int, const scope sigaction_t*, sigaction_t*);
1549     int sigaddset(sigset_t*, int);
1550     int sigdelset(sigset_t*, int);
1551     int sigemptyset(sigset_t *);
1552     int sigfillset(sigset_t *);
1553     int sigismember(const scope sigset_t*, int);
1554     int sigpending(sigset_t *);
1555     int sigprocmask(int, const scope sigset_t*, sigset_t*);
1556     int sigsuspend(const scope sigset_t*);
1557     int sigwait(const scope sigset_t*, int*);
1558 }
1559 else version (Solaris)
1560 {
1561     int kill(pid_t, int);
1562     int sigaction(int, const scope sigaction_t*, sigaction_t*);
1563     int sigaddset(sigset_t*, int);
1564     int sigdelset(sigset_t*, int);
1565     int sigemptyset(sigset_t*);
1566     int sigfillset(sigset_t*);
1567     int sigismember(const scope sigset_t*, int);
1568     int sigpending(sigset_t*);
1569     int sigprocmask(int, const scope sigset_t*, sigset_t*);
1570     int sigsuspend(const scope sigset_t*);
1571     int sigwait(const scope sigset_t*, int*);
1572 }
1573 else version (CRuntime_Bionic)
1574 {
1575     public import core.sys.posix.time: timer_t;
1576     import core.stdc.string : memset;
1577 
1578     version (X86)
1579         enum int LONG_BIT = 32;
1580     else version (ARM)
1581         enum int LONG_BIT = 32;
1582     else version (AArch64)
1583         enum int LONG_BIT = 64;
1584     else version (X86_64)
1585         enum int LONG_BIT = 64;
1586     else
1587         static assert(false, "Architecture not supported.");
1588 
1589     int kill(pid_t, int);
1590     int sigaction(int, const scope sigaction_t*, sigaction_t*);
1591 
1592     // These functions are defined inline in bionic.
1593     int sigaddset(sigset_t* set, int signum) @system
1594     {
1595         c_ulong* local_set = cast(c_ulong*) set;
1596         signum--;
1597         local_set[signum/LONG_BIT] |= 1UL << (signum%LONG_BIT);
1598         return 0;
1599     }
1600 
1601     int sigdelset(sigset_t* set, int signum) @system
1602     {
1603         c_ulong* local_set = cast(c_ulong*) set;
1604         signum--;
1605         local_set[signum/LONG_BIT] &= ~(1UL << (signum%LONG_BIT));
1606         return 0;
1607     }
1608 
1609     int sigemptyset(sigset_t* set) { memset(set, 0, (*set).sizeof); return 0; }
1610 
1611     int sigfillset(sigset_t* set) { memset(set, ~0, (*set).sizeof); return 0; }
1612 
1613     int sigismember(sigset_t* set, int signum) @system
1614     {
1615         c_ulong* local_set = cast(c_ulong*) set;
1616         signum--;
1617         return cast(int) ((local_set[signum/LONG_BIT] >> (signum%LONG_BIT)) & 1);
1618     }
1619 
1620     int sigpending(sigset_t*);
1621     int sigprocmask(int, const scope sigset_t*, sigset_t*);
1622     int sigsuspend(const scope sigset_t*);
1623     int sigwait(const scope sigset_t*, int*);
1624 }
1625 else version (CRuntime_Musl)
1626 {
1627     int kill(pid_t, int);
1628     int sigaction(int, const scope sigaction_t*, sigaction_t*);
1629     int sigaddset(sigset_t*, int);
1630     int sigdelset(sigset_t*, int);
1631     int sigemptyset(sigset_t*);
1632     int sigfillset(sigset_t*);
1633     int sigismember(const scope sigset_t*, int);
1634     int sigpending(sigset_t*);
1635     int sigprocmask(int, const scope sigset_t*, sigset_t*);
1636     int sigsuspend(const scope sigset_t*);
1637     int sigwait(const scope sigset_t*, int*);
1638 }
1639 else version (CRuntime_UClibc)
1640 {
1641     int kill(pid_t, int);
1642     int sigaction(int, const scope sigaction_t*, sigaction_t*);
1643     int sigaddset(sigset_t*, int);
1644     int sigdelset(sigset_t*, int);
1645     int sigemptyset(sigset_t*);
1646     int sigfillset(sigset_t*);
1647     int sigismember(const scope sigset_t*, int);
1648     int sigpending(sigset_t*);
1649     int sigprocmask(int, const scope sigset_t*, sigset_t*);
1650     int sigsuspend(const scope sigset_t*);
1651     int sigwait(const scope sigset_t*, int*);
1652 }
1653 else
1654 {
1655     static assert(false, "Unsupported platform");
1656 }
1657 }
1658 
1659 //
1660 // XOpen (XSI)
1661 //
1662 /*
1663 SIGPOLL
1664 SIGPROF
1665 SIGSYS
1666 SIGTRAP
1667 SIGVTALRM
1668 SIGXCPU
1669 SIGXFSZ
1670 
1671 SA_ONSTACK
1672 SA_RESETHAND
1673 SA_RESTART
1674 SA_SIGINFO
1675 SA_NOCLDWAIT
1676 SA_NODEFER
1677 
1678 ILL_ILLOPC
1679 ILL_ILLOPN
1680 ILL_ILLADR
1681 ILL_ILLTRP
1682 ILL_PRVOPC
1683 ILL_PRVREG
1684 ILL_COPROC
1685 ILL_BADSTK
1686 
1687 FPE_INTDIV
1688 FPE_INTOVF
1689 FPE_FLTDIV
1690 FPE_FLTOVF
1691 FPE_FLTUND
1692 FPE_FLTRES
1693 FPE_FLTINV
1694 FPE_FLTSUB
1695 
1696 SEGV_MAPERR
1697 SEGV_ACCERR
1698 
1699 BUS_ADRALN
1700 BUS_ADRERR
1701 BUS_OBJERR
1702 
1703 TRAP_BRKPT
1704 TRAP_TRACE
1705 
1706 CLD_EXITED
1707 CLD_KILLED
1708 CLD_DUMPED
1709 CLD_TRAPPED
1710 CLD_STOPPED
1711 CLD_CONTINUED
1712 
1713 POLL_IN
1714 POLL_OUT
1715 POLL_MSG
1716 POLL_ERR
1717 POLL_PRI
1718 POLL_HUP
1719 */
1720 
1721 version (linux)
1722 {
1723     version (X86_Any)
1724     {
1725         enum SIGPOLL        = 29;
1726         enum SIGPROF        = 27;
1727         enum SIGSYS         = 31;
1728         enum SIGTRAP        = 5;
1729         enum SIGVTALRM      = 26;
1730         enum SIGXCPU        = 24;
1731         enum SIGXFSZ        = 25;
1732     }
1733     else version (HPPA_Any)
1734     {
1735         enum SIGPOLL    = 22;
1736         enum SIGPROF    = 21;
1737         enum SIGSYS     = 31;
1738         enum SIGTRAP    = 5;
1739         enum SIGVTALRM  = 20;
1740         enum SIGXCPU    = 12;
1741         enum SIGXFSZ    = 30;
1742     }
1743     else version (MIPS_Any)
1744     {
1745         enum SIGPOLL    = 22;
1746         enum SIGPROF    = 29;
1747         enum SIGSYS     = 12;
1748         enum SIGTRAP    = 5;
1749         enum SIGVTALRM  = 28;
1750         enum SIGXCPU    = 30;
1751         enum SIGXFSZ    = 31;
1752     }
1753     else version (PPC_Any)
1754     {
1755         enum SIGPOLL    = 29;
1756         enum SIGPROF    = 27;
1757         enum SIGSYS     = 31;
1758         enum SIGTRAP    = 5;
1759         enum SIGVTALRM  = 26;
1760         enum SIGXCPU    = 24;
1761         enum SIGXFSZ    = 25;
1762     }
1763     else version (ARM_Any)
1764     {
1765         enum SIGPOLL    = 29;
1766         enum SIGPROF    = 27;
1767         enum SIGSYS     = 31;
1768         enum SIGTRAP    = 5;
1769         enum SIGVTALRM  = 26;
1770         enum SIGXCPU    = 24;
1771         enum SIGXFSZ    = 25;
1772     }
1773     else version (RISCV_Any)
1774     {
1775         enum SIGPOLL    = 29;
1776         enum SIGPROF    = 27;
1777         enum SIGSYS     = 31;
1778         enum SIGTRAP    = 5;
1779         enum SIGVTALRM  = 26;
1780         enum SIGXCPU    = 24;
1781         enum SIGXFSZ    = 25;
1782     }
1783     else version (SPARC_Any)
1784     {
1785         enum SIGPOLL    = 23;
1786         enum SIGPROF    = 27;
1787         enum SIGSYS     = 12;
1788         enum SIGTRAP    = 5;
1789         enum SIGVTALRM  = 26;
1790         enum SIGXCPU    = 24;
1791         enum SIGXFSZ    = 25;
1792     }
1793     else version (IBMZ_Any)
1794     {
1795         enum SIGPOLL    = 29;
1796         enum SIGPROF    = 27;
1797         enum SIGSYS     = 31;
1798         enum SIGTRAP    = 5;
1799         enum SIGVTALRM  = 26;
1800         enum SIGXCPU    = 24;
1801         enum SIGXFSZ    = 25;
1802     }
1803     else version (LoongArch64)
1804     {
1805         enum SIGPOLL    = 29;
1806         enum SIGPROF    = 27;
1807         enum SIGSYS     = 31;
1808         enum SIGTRAP    = 5;
1809         enum SIGVTALRM  = 26;
1810         enum SIGXCPU    = 24;
1811         enum SIGXFSZ    = 25;
1812     }
1813     else version (WebAssembly)
1814     {
1815 	// FIXME: copy paste from X86_Any?
1816     }
1817     else
1818         static assert(0, "unimplemented");
1819 
1820     version (MIPS_Any)
1821     {
1822         enum SA_ONSTACK   = 0x08000000;
1823         enum SA_RESETHAND = 0x80000000;
1824         enum SA_RESTART   = 0x10000000;
1825         enum SA_SIGINFO   = 8;
1826         enum SA_NOCLDWAIT = 0x10000;
1827         enum SA_NODEFER   = 0x40000000;
1828     }
1829     else
1830     {
1831         enum SA_ONSTACK   = 0x08000000;
1832         enum SA_RESETHAND = 0x80000000;
1833         enum SA_RESTART   = 0x10000000;
1834         enum SA_SIGINFO   = 4;
1835         enum SA_NOCLDWAIT = 2;
1836         enum SA_NODEFER   = 0x40000000;
1837     }
1838 
1839     enum SA_NOMASK      = SA_NODEFER;
1840     enum SA_ONESHOT     = SA_RESETHAND;
1841     enum SA_STACK       = SA_ONSTACK;
1842 
1843     enum
1844     {
1845         ILL_ILLOPC = 1,
1846         ILL_ILLOPN,
1847         ILL_ILLADR,
1848         ILL_ILLTRP,
1849         ILL_PRVOPC,
1850         ILL_PRVREG,
1851         ILL_COPROC,
1852         ILL_BADSTK
1853     }
1854 
1855     enum
1856     {
1857         FPE_INTDIV = 1,
1858         FPE_INTOVF,
1859         FPE_FLTDIV,
1860         FPE_FLTOVF,
1861         FPE_FLTUND,
1862         FPE_FLTRES,
1863         FPE_FLTINV,
1864         FPE_FLTSUB
1865     }
1866 
1867     enum
1868     {
1869         SEGV_MAPERR = 1,
1870         SEGV_ACCERR
1871     }
1872 
1873     enum
1874     {
1875         BUS_ADRALN = 1,
1876         BUS_ADRERR,
1877         BUS_OBJERR
1878     }
1879 
1880     enum
1881     {
1882         TRAP_BRKPT = 1,
1883         TRAP_TRACE
1884     }
1885 
1886     enum
1887     {
1888         CLD_EXITED = 1,
1889         CLD_KILLED,
1890         CLD_DUMPED,
1891         CLD_TRAPPED,
1892         CLD_STOPPED,
1893         CLD_CONTINUED
1894     }
1895 
1896     enum
1897     {
1898         POLL_IN = 1,
1899         POLL_OUT,
1900         POLL_MSG,
1901         POLL_ERR,
1902         POLL_PRI,
1903         POLL_HUP
1904     }
1905 }
1906 else version (Darwin)
1907 {
1908     enum SIGPOLL        = 7;
1909     enum SIGPROF        = 27;
1910     enum SIGSYS         = 12;
1911     enum SIGTRAP        = 5;
1912     enum SIGVTALRM      = 26;
1913     enum SIGXCPU        = 24;
1914     enum SIGXFSZ        = 25;
1915 
1916     enum SA_ONSTACK     = 0x0001;
1917     enum SA_RESETHAND   = 0x0004;
1918     enum SA_RESTART     = 0x0002;
1919     enum SA_SIGINFO     = 0x0040;
1920     enum SA_NOCLDWAIT   = 0x0020;
1921     enum SA_NODEFER     = 0x0010;
1922 
1923     enum ILL_ILLOPC = 1;
1924     enum ILL_ILLOPN = 4;
1925     enum ILL_ILLADR = 5;
1926     enum ILL_ILLTRP = 2;
1927     enum ILL_PRVOPC = 3;
1928     enum ILL_PRVREG = 6;
1929     enum ILL_COPROC = 7;
1930     enum ILL_BADSTK = 8;
1931 
1932     enum FPE_INTDIV = 7;
1933     enum FPE_INTOVF = 8;
1934     enum FPE_FLTDIV = 1;
1935     enum FPE_FLTOVF = 2;
1936     enum FPE_FLTUND = 3;
1937     enum FPE_FLTRES = 4;
1938     enum FPE_FLTINV = 5;
1939     enum FPE_FLTSUB = 6;
1940 
1941     enum
1942     {
1943         SEGV_MAPERR = 1,
1944         SEGV_ACCERR
1945     }
1946 
1947     enum
1948     {
1949         BUS_ADRALN = 1,
1950         BUS_ADRERR,
1951         BUS_OBJERR
1952     }
1953 
1954     enum
1955     {
1956         TRAP_BRKPT = 1,
1957         TRAP_TRACE
1958     }
1959 
1960     enum
1961     {
1962         CLD_EXITED = 1,
1963         CLD_KILLED,
1964         CLD_DUMPED,
1965         CLD_TRAPPED,
1966         CLD_STOPPED,
1967         CLD_CONTINUED
1968     }
1969 
1970     enum
1971     {
1972         POLL_IN = 1,
1973         POLL_OUT,
1974         POLL_MSG,
1975         POLL_ERR,
1976         POLL_PRI,
1977         POLL_HUP
1978     }
1979 }
1980 else version (FreeBSD)
1981 {
1982     // No SIGPOLL on *BSD
1983     enum SIGPROF        = 27;
1984     enum SIGSYS         = 12;
1985     enum SIGTRAP        = 5;
1986     enum SIGVTALRM      = 26;
1987     enum SIGXCPU        = 24;
1988     enum SIGXFSZ        = 25;
1989 
1990     enum
1991     {
1992         SA_ONSTACK      = 0x0001,
1993         SA_RESTART      = 0x0002,
1994         SA_RESETHAND    = 0x0004,
1995         SA_NODEFER      = 0x0010,
1996         SA_NOCLDWAIT    = 0x0020,
1997         SA_SIGINFO      = 0x0040,
1998     }
1999 
2000     enum
2001     {
2002         ILL_ILLOPC = 1,
2003         ILL_ILLOPN,
2004         ILL_ILLADR,
2005         ILL_ILLTRP,
2006         ILL_PRVOPC,
2007         ILL_PRVREG,
2008         ILL_COPROC,
2009         ILL_BADSTK,
2010     }
2011 
2012     enum
2013     {
2014         BUS_ADRALN = 1,
2015         BUS_ADRERR,
2016         BUS_OBJERR,
2017     }
2018 
2019     enum
2020     {
2021         SEGV_MAPERR = 1,
2022         SEGV_ACCERR,
2023     }
2024 
2025     enum
2026     {
2027         FPE_INTOVF = 1,
2028         FPE_INTDIV,
2029         FPE_FLTDIV,
2030         FPE_FLTOVF,
2031         FPE_FLTUND,
2032         FPE_FLTRES,
2033         FPE_FLTINV,
2034         FPE_FLTSUB,
2035     }
2036 
2037     enum
2038     {
2039         TRAP_BRKPT = 1,
2040         TRAP_TRACE,
2041     }
2042 
2043     enum
2044     {
2045         CLD_EXITED = 1,
2046         CLD_KILLED,
2047         CLD_DUMPED,
2048         CLD_TRAPPED,
2049         CLD_STOPPED,
2050         CLD_CONTINUED,
2051     }
2052 
2053     enum
2054     {
2055         POLL_IN = 1,
2056         POLL_OUT,
2057         POLL_MSG,
2058         POLL_ERR,
2059         POLL_PRI,
2060         POLL_HUP,
2061     }
2062 }
2063 else version (NetBSD)
2064 {
2065     // No SIGPOLL on *BSD
2066     enum SIGPROF        = 27;
2067     enum SIGSYS         = 12;
2068     enum SIGTRAP        = 5;
2069     enum SIGVTALRM      = 26;
2070     enum SIGXCPU        = 24;
2071     enum SIGXFSZ        = 25;
2072 
2073     enum
2074     {
2075         SA_ONSTACK      = 0x0001,
2076         SA_RESTART      = 0x0002,
2077         SA_RESETHAND    = 0x0004,
2078         SA_NODEFER      = 0x0010,
2079         SA_NOCLDWAIT    = 0x0020,
2080         SA_SIGINFO      = 0x0040,
2081     }
2082 
2083     enum
2084     {
2085         ILL_ILLOPC = 1,
2086         ILL_ILLOPN,
2087         ILL_ILLADR,
2088         ILL_ILLTRP,
2089         ILL_PRVOPC,
2090         ILL_PRVREG,
2091         ILL_COPROC,
2092         ILL_BADSTK,
2093     }
2094 
2095     enum
2096     {
2097         BUS_ADRALN = 1,
2098         BUS_ADRERR,
2099         BUS_OBJERR,
2100     }
2101 
2102     enum
2103     {
2104         SEGV_MAPERR = 1,
2105         SEGV_ACCERR,
2106     }
2107 
2108     enum
2109     {
2110         FPE_INTOVF = 1,
2111         FPE_INTDIV,
2112         FPE_FLTDIV,
2113         FPE_FLTOVF,
2114         FPE_FLTUND,
2115         FPE_FLTRES,
2116         FPE_FLTINV,
2117         FPE_FLTSUB,
2118     }
2119 
2120     enum
2121     {
2122         TRAP_BRKPT = 1,
2123         TRAP_TRACE,
2124     }
2125 
2126     enum
2127     {
2128         CLD_EXITED = 1,
2129         CLD_KILLED,
2130         CLD_DUMPED,
2131         CLD_TRAPPED,
2132         CLD_STOPPED,
2133         CLD_CONTINUED,
2134     }
2135 
2136     enum
2137     {
2138         POLL_IN = 1,
2139         POLL_OUT,
2140         POLL_MSG,
2141         POLL_ERR,
2142         POLL_PRI,
2143         POLL_HUP,
2144     }
2145 }
2146 else version (OpenBSD)
2147 {
2148     // No SIGPOLL on *BSD
2149     enum SIGPROF        = 27;
2150     enum SIGSYS         = 12;
2151     enum SIGTRAP        = 5;
2152     enum SIGVTALRM      = 26;
2153     enum SIGXCPU        = 24;
2154     enum SIGXFSZ        = 25;
2155 
2156     enum
2157     {
2158         SA_ONSTACK      = 0x0001,
2159         SA_RESTART      = 0x0002,
2160         SA_RESETHAND    = 0x0004,
2161         SA_NODEFER      = 0x0010,
2162         SA_NOCLDWAIT    = 0x0020,
2163         SA_SIGINFO      = 0x0040,
2164     }
2165 
2166     enum
2167     {
2168         ILL_ILLOPC = 1,
2169         ILL_ILLOPN,
2170         ILL_ILLADR,
2171         ILL_ILLTRP,
2172         ILL_PRVOPC,
2173         ILL_PRVREG,
2174         ILL_COPROC,
2175         ILL_BADSTK,
2176         NSIGILL = ILL_BADSTK,
2177     }
2178 
2179     enum
2180     {
2181         BUS_ADRALN = 1,
2182         BUS_ADRERR,
2183         BUS_OBJERR,
2184         NSIGBUS = BUS_OBJERR,
2185     }
2186 
2187     enum
2188     {
2189         SEGV_MAPERR = 1,
2190         SEGV_ACCERR,
2191         NSIGSEGV = SEGV_ACCERR,
2192     }
2193 
2194     enum
2195     {
2196         FPE_INTDIV = 1,
2197         FPE_INTOVF,
2198         FPE_FLTDIV,
2199         FPE_FLTOVF,
2200         FPE_FLTUND,
2201         FPE_FLTRES,
2202         FPE_FLTINV,
2203         FPE_FLTSUB,
2204         NSIGFPE = FPE_FLTSUB,
2205     }
2206 
2207     enum
2208     {
2209         TRAP_BRKPT = 1,
2210         TRAP_TRACE,
2211         NSIGTRAP = TRAP_TRACE,
2212     }
2213 
2214     enum
2215     {
2216         CLD_EXITED = 1,
2217         CLD_KILLED,
2218         CLD_DUMPED,
2219         CLD_TRAPPED,
2220         CLD_STOPPED,
2221         CLD_CONTINUED,
2222         NSIGCLD = CLD_CONTINUED,
2223     }
2224 
2225     enum
2226     {
2227         POLL_IN = 1,
2228         POLL_OUT,
2229         POLL_MSG,
2230         POLL_ERR,
2231         POLL_PRI,
2232         POLL_HUP,
2233         NSIGPOLL = POLL_HUP,
2234     }
2235 }
2236 else version (DragonFlyBSD)
2237 {
2238     // No SIGPOLL on *BSD
2239     enum SIGPROF        = 27;
2240     enum SIGSYS         = 12;
2241     enum SIGTRAP        = 5;
2242     enum SIGVTALRM      = 26;
2243     enum SIGXCPU        = 24;
2244     enum SIGXFSZ        = 25;
2245 
2246     enum
2247     {
2248         SA_ONSTACK      = 0x0001,
2249         SA_RESTART      = 0x0002,
2250         SA_RESETHAND    = 0x0004,
2251         SA_NODEFER      = 0x0010,
2252         SA_NOCLDWAIT    = 0x0020,
2253         SA_SIGINFO      = 0x0040,
2254     }
2255 
2256     enum
2257     {
2258         ILL_ILLOPC = 1,
2259         ILL_ILLOPN,
2260         ILL_ILLADR,
2261         ILL_ILLTRP,
2262         ILL_PRVOPC,
2263         ILL_PRVREG,
2264         ILL_COPROC,
2265         ILL_BADSTK,
2266     }
2267 
2268     enum
2269     {
2270         BUS_ADRALN = 1,
2271         BUS_ADRERR,
2272         BUS_OBJERR,
2273     }
2274 
2275     enum
2276     {
2277         SEGV_MAPERR = 1,
2278         SEGV_ACCERR,
2279     }
2280 
2281     enum
2282     {
2283         FPE_INTOVF = 1,
2284         FPE_INTDIV,
2285         FPE_FLTDIV,
2286         FPE_FLTOVF,
2287         FPE_FLTUND,
2288         FPE_FLTRES,
2289         FPE_FLTINV,
2290         FPE_FLTSUB,
2291     }
2292 
2293     enum
2294     {
2295         TRAP_BRKPT = 1,
2296         TRAP_TRACE,
2297     }
2298 
2299     enum
2300     {
2301         CLD_EXITED = 1,
2302         CLD_KILLED,
2303         CLD_DUMPED,
2304         CLD_TRAPPED,
2305         CLD_STOPPED,
2306         CLD_CONTINUED,
2307     }
2308 
2309     enum
2310     {
2311         POLL_IN = 1,
2312         POLL_OUT,
2313         POLL_MSG,
2314         POLL_ERR,
2315         POLL_PRI,
2316         POLL_HUP,
2317     }
2318 }
2319 else version (Solaris)
2320 {
2321     enum SIGPOLL = 22;
2322     enum SIGIO = SIGPOLL;
2323     enum SIGPROF = 29;
2324     enum SIGSYS = 12;
2325     enum SIGTRAP = 5;
2326     enum SIGVTALRM = 28;
2327     enum SIGXCPU = 30;
2328     enum SIGXFSZ = 31;
2329 
2330     enum
2331     {
2332         SA_ONSTACK = 0x00001,
2333         SA_RESTART = 0x00004,
2334         SA_RESETHAND = 0x00002,
2335         SA_NODEFER = 0x00010,
2336         SA_NOCLDWAIT = 0x10000,
2337         SA_SIGINFO = 0x00008,
2338     }
2339 
2340     enum
2341     {
2342         ILL_ILLOPC = 1,
2343         ILL_ILLOPN,
2344         ILL_ILLADR,
2345         ILL_ILLTRP,
2346         ILL_PRVOPC,
2347         ILL_PRVREG,
2348         ILL_COPROC,
2349         ILL_BADSTK,
2350     }
2351 
2352     enum
2353     {
2354         BUS_ADRALN = 1,
2355         BUS_ADRERR,
2356         BUS_OBJERR,
2357     }
2358 
2359     enum
2360     {
2361         SEGV_MAPERR = 1,
2362         SEGV_ACCERR,
2363     }
2364 
2365     enum
2366     {
2367         FPE_INTDIV = 1,
2368         FPE_INTOVF,
2369         FPE_FLTDIV,
2370         FPE_FLTOVF,
2371         FPE_FLTUND,
2372         FPE_FLTRES,
2373         FPE_FLTINV,
2374         FPE_FLTSUB,
2375         FPE_FLTDEN,
2376     }
2377 
2378     enum
2379     {
2380         TRAP_BRKPT = 1,
2381         TRAP_TRACE,
2382         TRAP_RWATCH,
2383         TRAP_WWATCH,
2384         TRAP_XWATCH,
2385         TRAP_DTRACE,
2386     }
2387 
2388     enum
2389     {
2390         CLD_EXITED = 1,
2391         CLD_KILLED,
2392         CLD_DUMPED,
2393         CLD_TRAPPED,
2394         CLD_STOPPED,
2395         CLD_CONTINUED,
2396     }
2397 
2398     enum
2399     {
2400         POLL_IN = 1,
2401         POLL_OUT,
2402         POLL_MSG,
2403         POLL_ERR,
2404         POLL_PRI,
2405         POLL_HUP,
2406     }
2407 }
2408 else
2409 {
2410     static assert(false, "Unsupported platform");
2411 }
2412 
2413 /*
2414 SS_ONSTACK
2415 SS_DISABLE
2416 MINSIGSTKSZ
2417 SIGSTKSZ
2418 
2419 ucontext_t // from ucontext
2420 mcontext_t // from ucontext
2421 
2422 struct stack_t
2423 {
2424     void*   ss_sp;
2425     size_t  ss_size;
2426     int     ss_flags;
2427 }
2428 
2429 struct sigstack
2430 {
2431     int   ss_onstack;
2432     void* ss_sp;
2433 }
2434 
2435 sigfn_t bsd_signal(int sig, sigfn_t func);
2436 sigfn_t sigset(int sig, sigfn_t func);
2437 
2438 int killpg(pid_t, int);
2439 int sigaltstack(const scope stack_t*, stack_t*);
2440 int sighold(int);
2441 int sigignore(int);
2442 int siginterrupt(int, int);
2443 int sigpause(int);
2444 int sigrelse(int);
2445 */
2446 
2447 version (CRuntime_Glibc)
2448 {
2449     enum SS_ONSTACK     = 1;
2450     enum SS_DISABLE     = 2;
2451     enum MINSIGSTKSZ    = 2048;
2452     enum SIGSTKSZ       = 8192;
2453 
2454     //ucontext_t (defined in core.sys.posix.ucontext)
2455     //mcontext_t (defined in core.sys.posix.ucontext)
2456 
2457     version (MIPS_Any)
2458     {
2459         struct stack_t
2460         {
2461             void*   ss_sp;
2462             size_t  ss_size;
2463             int     ss_flags;
2464         }
2465     }
2466     else
2467     {
2468         struct stack_t
2469         {
2470             void*   ss_sp;
2471             int     ss_flags;
2472             size_t  ss_size;
2473         }
2474     }
2475 
2476     struct sigstack
2477     {
2478         void*   ss_sp;
2479         int     ss_onstack;
2480     }
2481 
2482     sigfn_t bsd_signal(int sig, sigfn_t func);
2483     sigfn_t sigset(int sig, sigfn_t func);
2484 
2485   nothrow:
2486   @nogc:
2487     sigfn_t2 bsd_signal(int sig, sigfn_t2 func);
2488     sigfn_t2 sigset(int sig, sigfn_t2 func);
2489 
2490     int killpg(pid_t, int);
2491     int sigaltstack(const scope stack_t*, stack_t*);
2492     int sighold(int);
2493     int sigignore(int);
2494     int siginterrupt(int, int);
2495     int sigpause(int);
2496     int sigrelse(int);
2497 }
2498 else version (Darwin)
2499 {
2500     enum SS_ONSTACK     = 0x0001;
2501     enum SS_DISABLE     = 0x0004;
2502     enum MINSIGSTKSZ    = 32768;
2503     enum SIGSTKSZ       = 131072;
2504 
2505     //ucontext_t (defined in core.sys.posix.ucontext)
2506     //mcontext_t (defined in core.sys.posix.ucontext)
2507 
2508     struct stack_t
2509     {
2510         void*   ss_sp;
2511         size_t  ss_size;
2512         int     ss_flags;
2513     }
2514 
2515     struct sigstack
2516     {
2517         void*   ss_sp;
2518         int     ss_onstack;
2519     }
2520 
2521     sigfn_t bsd_signal(int sig, sigfn_t func);
2522     sigfn_t sigset(int sig, sigfn_t func);
2523 
2524   nothrow:
2525   @nogc:
2526     sigfn_t2 bsd_signal(int sig, sigfn_t2 func);
2527     sigfn_t2 sigset(int sig, sigfn_t2 func);
2528 
2529     int killpg(pid_t, int);
2530     int sigaltstack(const scope stack_t*, stack_t*);
2531     int sighold(int);
2532     int sigignore(int);
2533     int siginterrupt(int, int);
2534     int sigpause(int);
2535     int sigrelse(int);
2536 }
2537 else version (FreeBSD)
2538 {
2539     enum
2540     {
2541         SS_ONSTACK = 0x0001,
2542         SS_DISABLE = 0x0004,
2543     }
2544 
2545     enum MINSIGSTKSZ = 512 * 4;
2546     enum SIGSTKSZ    = (MINSIGSTKSZ + 32768);
2547 
2548     //ucontext_t (defined in core.sys.posix.ucontext)
2549     //mcontext_t (defined in core.sys.posix.ucontext)
2550 
2551     struct stack_t
2552     {
2553         void*   ss_sp;
2554         size_t  ss_size;
2555         int     ss_flags;
2556     }
2557 
2558     struct sigstack
2559     {
2560         void*   ss_sp;
2561         int     ss_onstack;
2562     }
2563 
2564     //sigfn_t bsd_signal(int sig, sigfn_t func);
2565     sigfn_t sigset(int sig, sigfn_t func);
2566 
2567   nothrow:
2568   @nogc:
2569     //sigfn_t2 bsd_signal(int sig, sigfn_t2 func);
2570     sigfn_t2 sigset(int sig, sigfn_t2 func);
2571 
2572     int killpg(pid_t, int);
2573     int sigaltstack(const scope stack_t*, stack_t*);
2574     int sighold(int);
2575     int sigignore(int);
2576     int siginterrupt(int, int);
2577     int sigpause(int);
2578     int sigrelse(int);
2579 }
2580 else version (NetBSD)
2581 {
2582     enum
2583     {
2584         SS_ONSTACK = 0x0001,
2585         SS_DISABLE = 0x0004,
2586     }
2587 
2588     enum MINSIGSTKSZ = 8192;
2589     enum SIGSTKSZ    = (MINSIGSTKSZ + 32768);
2590 
2591     //ucontext_t (defined in core.sys.posix.ucontext)
2592     //mcontext_t (defined in core.sys.posix.ucontext)
2593 
2594     struct stack_t
2595     {
2596         void*   ss_sp;
2597         size_t  ss_size;
2598         int     ss_flags;
2599     }
2600 
2601     struct sigstack
2602     {
2603         void*   ss_sp;
2604         int     ss_onstack;
2605     }
2606 
2607     //sigfn_t bsd_signal(int sig, sigfn_t func);
2608     sigfn_t sigset(int sig, sigfn_t func);
2609 
2610   nothrow:
2611   @nogc:
2612     //sigfn_t2 bsd_signal(int sig, sigfn_t2 func);
2613     sigfn_t2 sigset(int sig, sigfn_t2 func);
2614 
2615     int killpg(pid_t, int);
2616     int sigaltstack(const scope stack_t*, stack_t*);
2617     int sighold(int);
2618     int sigignore(int);
2619     int siginterrupt(int, int);
2620     int sigpause(int);
2621     int sigrelse(int);
2622 }
2623 else version (OpenBSD)
2624 {
2625     enum
2626     {
2627         SS_ONSTACK = 0x0001,
2628         SS_DISABLE = 0x0004,
2629     }
2630 
2631     enum MINSIGSTKSZ = 8192;
2632     enum SIGSTKSZ    = (MINSIGSTKSZ + 32768);
2633 
2634     //ucontext_t (defined in core.sys.posix.ucontext)
2635     //mcontext_t (defined in core.sys.posix.ucontext)
2636 
2637     struct stack_t
2638     {
2639         void*   ss_sp;
2640         size_t  ss_size;
2641         int     ss_flags;
2642     }
2643 
2644   nothrow:
2645   @nogc:
2646     int killpg(pid_t, int);
2647     int sigaltstack(const scope stack_t*, stack_t*);
2648     int siginterrupt(int, int);
2649     int sigpause(int);
2650 }
2651 else version (DragonFlyBSD)
2652 {
2653     enum
2654     {
2655         SS_ONSTACK = 0x0001,
2656         SS_DISABLE = 0x0004,
2657     }
2658 
2659     enum MINSIGSTKSZ = 8192;
2660     enum SIGSTKSZ    = (MINSIGSTKSZ + 32768);
2661 
2662     //ucontext_t (defined in core.sys.posix.ucontext)
2663     //mcontext_t (defined in core.sys.posix.ucontext)
2664 
2665     struct stack_t
2666     {
2667         void*   ss_sp;
2668         size_t  ss_size;
2669         int     ss_flags;
2670     }
2671 
2672     struct sigstack
2673     {
2674         void*   ss_sp;
2675         int     ss_onstack;
2676     }
2677 
2678     //sigfn_t bsd_signal(int sig, sigfn_t func);
2679     sigfn_t sigset(int sig, sigfn_t func);
2680 
2681   nothrow:
2682   @nogc:
2683     //sigfn_t2 bsd_signal(int sig, sigfn_t2 func);
2684     sigfn_t2 sigset(int sig, sigfn_t2 func);
2685 
2686     int killpg(pid_t, int);
2687     int sigaltstack(const scope stack_t*, stack_t*);
2688     int sighold(int);
2689     int sigignore(int);
2690     int siginterrupt(int, int);
2691     int sigpause(int);
2692     int sigrelse(int);
2693 }
2694 else version (Solaris)
2695 {
2696     enum
2697     {
2698         SS_ONSTACK = 0x0001,
2699         SS_DISABLE = 0x0002,
2700     }
2701 
2702     enum MINSIGSTKSZ = 2048;
2703     enum SIGSTKSZ = 8192;
2704 
2705     struct stack_t
2706     {
2707         void* ss_sp;
2708         size_t ss_size;
2709         int ss_flags;
2710     }
2711 
2712     struct sigstack
2713     {
2714         void* ss_sp;
2715         int ss_onstack;
2716     }
2717 
2718     sigfn_t sigset(int sig, sigfn_t func);
2719 
2720   nothrow:
2721   @nogc:
2722     sigfn_t2 sigset(int sig, sigfn_t2 func);
2723 
2724     int killpg(pid_t, int);
2725     int sigaltstack(const scope stack_t*, stack_t*);
2726     int sighold(int);
2727     int sigignore(int);
2728     int siginterrupt(int, int);
2729     int sigpause(int);
2730     int sigrelse(int);
2731 }
2732 else version (CRuntime_Bionic)
2733 {
2734     enum SS_ONSTACK     = 1;
2735     enum SS_DISABLE     = 2;
2736     enum MINSIGSTKSZ    = 2048;
2737     enum SIGSTKSZ       = 8192;
2738 
2739     struct stack_t
2740     {
2741         void*   ss_sp;
2742         int     ss_flags;
2743         size_t  ss_size;
2744     }
2745 
2746     sigfn_t bsd_signal(int, sigfn_t);
2747 
2748   nothrow:
2749   @nogc:
2750     sigfn_t2 bsd_signal(int, sigfn_t2);
2751 
2752     int killpg(int, int);
2753     int sigaltstack(const scope stack_t*, stack_t*);
2754     int siginterrupt(int, int);
2755 }
2756 else version (CRuntime_Musl)
2757 {
2758     enum SS_ONSTACK = 1;
2759     enum SS_DISABLE = 2;
2760 
2761     version (ARM)
2762     {
2763         enum MINSIGSTKSZ = 2048;
2764         enum SIGSTKSZ    = 8192;
2765     }
2766     else version (AArch64)
2767     {
2768         enum MINSIGSTKSZ = 6144;
2769         enum SIGSTKSZ    = 12288;
2770     }
2771     else version (IBMZ_Any)
2772     {
2773         enum MINSIGSTKSZ = 4096;
2774         enum SIGSTKSZ    = 10240;
2775     }
2776     else version (MIPS_Any)
2777     {
2778         enum MINSIGSTKSZ = 2048;
2779         enum SIGSTKSZ    = 8192;
2780     }
2781     else version (PPC_Any)
2782     {
2783         enum MINSIGSTKSZ = 4096;
2784         enum SIGSTKSZ    = 10240;
2785     }
2786     else version (X86_Any)
2787     {
2788         enum MINSIGSTKSZ = 2048;
2789         enum SIGSTKSZ    = 8192;
2790     }
2791     else version (WebAssembly)
2792     {
2793 	// FIXME: copy paste from X86_Any?
2794     }
2795     else
2796         static assert(0, "unimplemented");
2797 
2798     //ucontext_t (defined in core.sys.posix.ucontext)
2799     //mcontext_t (defined in core.sys.posix.ucontext)
2800 
2801     version (MIPS_Any)
2802     {
2803         struct stack_t
2804         {
2805             void*  ss_sp;
2806             size_t ss_size;
2807             int    ss_flags;
2808         }
2809     }
2810     else
2811     {
2812         struct stack_t
2813         {
2814             void*  ss_sp;
2815             int    ss_flags;
2816             size_t ss_size;
2817         }
2818     }
2819 
2820     sigfn_t bsd_signal(int sig, sigfn_t func);
2821     sigfn_t sigset(int sig, sigfn_t func);
2822 
2823   nothrow:
2824   @nogc:
2825     sigfn_t2 bsd_signal(int sig, sigfn_t2 func);
2826     sigfn_t2 sigset(int sig, sigfn_t2 func);
2827 
2828     int killpg(pid_t, int);
2829     int sigaltstack(const scope stack_t*, stack_t*);
2830     int sighold(int);
2831     int sigignore(int);
2832     int siginterrupt(int, int);
2833     int sigpause(int);
2834     int sigrelse(int);
2835 }
2836 else version (CRuntime_UClibc)
2837 {
2838     enum SS_ONSTACK     = 1;
2839     enum SS_DISABLE     = 2;
2840     enum MINSIGSTKSZ    = 2048;
2841     enum SIGSTKSZ       = 8192;
2842 
2843     version (MIPS_Any)
2844     {
2845         struct stack_t
2846         {
2847             void *ss_sp;
2848             size_t ss_size;
2849             int ss_flags;
2850         }
2851     }
2852     else
2853     {
2854         struct stack_t
2855         {
2856             void*   ss_sp;
2857             int     ss_flags;
2858             size_t  ss_size;
2859         }
2860      }
2861 
2862     struct sigstack
2863     {
2864         void*   ss_sp;
2865         int     ss_onstack;
2866     }
2867 
2868     sigfn_t sigset(int sig, sigfn_t func);
2869 
2870   nothrow:
2871   @nogc:
2872     sigfn_t2 sigset(int sig, sigfn_t2 func);
2873 
2874     int killpg(pid_t, int);
2875     int sigaltstack(const scope stack_t*, stack_t*);
2876     int sighold(int);
2877     int sigignore(int);
2878     int siginterrupt(int, int);
2879     int sigpause(int);
2880     int sigrelse(int);
2881 }
2882 else
2883 {
2884     static assert(false, "Unsupported platform");
2885 }
2886 
2887 //
2888 // Realtime Signals (RTS)
2889 //
2890 /*
2891 struct sigevent
2892 {
2893     int             sigev_notify;
2894     int             sigev_signo;
2895     sigval          sigev_value;
2896     void(*)(sigval) sigev_notify_function;
2897     pthread_attr_t* sigev_notify_attributes;
2898 }
2899 */
2900 
2901 nothrow:
2902 @nogc:
2903 
2904 version (linux)
2905 {
2906     private enum __SIGEV_MAX_SIZE = 64;
2907 
2908     static if ( __WORDSIZE == 64 )
2909     {
2910         private enum __SIGEV_PAD_SIZE = ((__SIGEV_MAX_SIZE / int.sizeof) - 4);
2911     }
2912     else
2913     {
2914         private enum __SIGEV_PAD_SIZE = ((__SIGEV_MAX_SIZE / int.sizeof) - 3);
2915     }
2916 
2917     struct sigevent
2918     {
2919         sigval      sigev_value;
2920         int         sigev_signo;
2921         int         sigev_notify;
2922 
2923         union
2924         {
2925             int[__SIGEV_PAD_SIZE] _pad;
2926             pid_t                 _tid;
2927 
2928             struct
2929             {
2930                 void function(sigval) sigev_notify_function;
2931                 void*                 sigev_notify_attributes;
2932             }
2933         }
2934     }
2935 }
2936 else version (FreeBSD)
2937 {
2938     struct sigevent
2939     {
2940         int             sigev_notify;
2941         int             sigev_signo;
2942         sigval          sigev_value;
2943         union
2944         {
2945             lwpid_t _threadid;
2946             struct
2947             {
2948                 void function(sigval) sigev_notify_function;
2949                 void* sigev_notify_attributes;
2950             }
2951             c_long[8] __spare__;
2952         }
2953     }
2954 }
2955 else version (NetBSD)
2956 {
2957     struct sigevent
2958     {
2959         int             sigev_notify;
2960         int             sigev_signo;
2961         sigval          sigev_value;
2962         void function(sigval) sigev_notify_function;
2963         void /* pthread_attr_t */*sigev_notify_attributes;
2964     }
2965 }
2966 else version (OpenBSD)
2967 {
2968     // OpenBSD does not implement sigevent.
2969     alias sigevent = void;
2970 }
2971 else version (DragonFlyBSD)
2972 {
2973     union  _sigev_un_t
2974     {
2975         int                       sigev_signo;
2976         int                       sigev_notify_kqueue;
2977         void /*pthread_attr_t*/ * sigev_notify_attributes;
2978     }
2979     union _sigval_t
2980     {
2981         int                       sival_int;
2982         void                    * sival_ptr;
2983         int                       sigval_int;
2984         void                    * sigval_ptr;
2985     }
2986     struct sigevent
2987     {
2988         int                       sigev_notify;
2989         _sigev_un_t               sigev_un;
2990         _sigval_t                 sigev_value;
2991         void function(_sigval_t)  sigev_notify_function;
2992     }
2993 }
2994 else version (Darwin)
2995 {
2996     struct sigevent
2997     {
2998         int sigev_notify;
2999         int sigev_signo;
3000         sigval sigev_value;
3001         void function(sigval) sigev_notify_function;
3002         pthread_attr_t* sigev_notify_attributes;
3003     }
3004 }
3005 else version (Solaris)
3006 {
3007     struct sigevent
3008     {
3009         int sigev_notify;
3010         int sigev_signo;
3011         sigval sigev_value;
3012         void function(sigval) sigev_notify_function;
3013         pthread_attr_t* sigev_notify_attributes;
3014         int __sigev_pad2;
3015     }
3016 }
3017 else
3018 {
3019     static assert(false, "Unsupported platform");
3020 }
3021 
3022 /*
3023 int sigqueue(pid_t, int, const sigval);
3024 int sigtimedwait(const scope sigset_t*, siginfo_t*, const scope timespec*);
3025 int sigwaitinfo(const scope sigset_t*, siginfo_t*);
3026 */
3027 
3028 nothrow:
3029 @nogc:
3030 
3031 version (CRuntime_Glibc)
3032 {
3033     int sigqueue(pid_t, int, const sigval);
3034     int sigtimedwait(const scope sigset_t*, siginfo_t*, const scope timespec*);
3035     int sigwaitinfo(const scope sigset_t*, siginfo_t*);
3036 }
3037 else version (FreeBSD)
3038 {
3039     int sigqueue(pid_t, int, const sigval);
3040     int sigtimedwait(const scope sigset_t*, siginfo_t*, const scope timespec*);
3041     int sigwaitinfo(const scope sigset_t*, siginfo_t*);
3042 }
3043 else version (NetBSD)
3044 {
3045     int sigqueue(pid_t, int, const sigval);
3046     int sigtimedwait(const scope sigset_t*, siginfo_t*, const scope timespec*);
3047     int sigwaitinfo(const scope sigset_t*, siginfo_t*);
3048 }
3049 else version (OpenBSD)
3050 {
3051 }
3052 else version (DragonFlyBSD)
3053 {
3054     int sigqueue(pid_t, int, const sigval);
3055     int sigtimedwait(const scope sigset_t*, siginfo_t*, const scope timespec*);
3056     int sigwaitinfo(const scope sigset_t*, siginfo_t*);
3057 }
3058 else version (Darwin)
3059 {
3060 }
3061 else version (Solaris)
3062 {
3063     int sigqueue(pid_t, int, const sigval);
3064     int sigtimedwait(const scope sigset_t*, siginfo_t*, const scope timespec*);
3065     int sigwaitinfo(const scope sigset_t*, siginfo_t*);
3066 }
3067 else version (CRuntime_Bionic)
3068 {
3069 }
3070 else version (CRuntime_Musl)
3071 {
3072     int sigqueue(pid_t, int, const sigval);
3073     pragma(mangle, muslRedirTime64Mangle!("sigtimedwait", "__sigtimedwait_time64"))
3074     int sigtimedwait(const scope sigset_t*, siginfo_t*, const scope timespec*);
3075     int sigwaitinfo(const scope sigset_t*, siginfo_t*);
3076 }
3077 else version (CRuntime_UClibc)
3078 {
3079     int sigqueue(pid_t, int, const sigval);
3080     int sigtimedwait(const scope sigset_t*, siginfo_t*, const scope timespec*);
3081     int sigwaitinfo(const scope sigset_t*, siginfo_t*);
3082 }
3083 else
3084 {
3085     static assert(false, "Unsupported platform");
3086 }
3087 
3088 //
3089 // Threads (THR)
3090 //
3091 /*
3092 int pthread_kill(pthread_t, int);
3093 int pthread_sigmask(int, const scope sigset_t*, sigset_t*);
3094 */
3095 
3096 version (CRuntime_Glibc)
3097 {
3098     int pthread_kill(pthread_t, int);
3099     int pthread_sigmask(int, const scope sigset_t*, sigset_t*);
3100 }
3101 else version (Darwin)
3102 {
3103     int pthread_kill(pthread_t, int);
3104     int pthread_sigmask(int, const scope sigset_t*, sigset_t*);
3105 }
3106 else version (FreeBSD)
3107 {
3108     int pthread_kill(pthread_t, int);
3109     int pthread_sigmask(int, const scope sigset_t*, sigset_t*);
3110 }
3111 else version (NetBSD)
3112 {
3113     int pthread_kill(pthread_t, int);
3114     int pthread_sigmask(int, const scope sigset_t*, sigset_t*);
3115 }
3116 else version (OpenBSD)
3117 {
3118     int pthread_kill(pthread_t, int);
3119     int pthread_sigmask(int, const scope sigset_t*, sigset_t*);
3120 }
3121 else version (DragonFlyBSD)
3122 {
3123     int pthread_kill(pthread_t, int);
3124     int pthread_sigmask(int, const scope sigset_t*, sigset_t*);
3125 }
3126 else version (Solaris)
3127 {
3128     int pthread_kill(pthread_t, int);
3129     int pthread_sigmask(int, const scope sigset_t*, sigset_t*);
3130 }
3131 else version (CRuntime_Bionic)
3132 {
3133     int pthread_kill(pthread_t, int);
3134     int pthread_sigmask(int, const scope sigset_t*, sigset_t*);
3135 }
3136 else version (CRuntime_Musl)
3137 {
3138     int pthread_kill(pthread_t, int);
3139     int pthread_sigmask(int, const scope sigset_t*, sigset_t*);
3140 }
3141 else version (CRuntime_UClibc)
3142 {
3143     int pthread_kill(pthread_t, int);
3144     int pthread_sigmask(int, const scope sigset_t*, sigset_t*);
3145     int pthread_sigqueue(pthread_t, int, sigval);
3146 }
3147 else
3148 {
3149     static assert(false, "Unsupported platform");
3150 }