master
  1#ifndef _WASI_EMULATED_SIGNAL
  2#error "wasm lacks signal support; to enable minimal signal emulation, \
  3compile with -D_WASI_EMULATED_SIGNAL and link with -lwasi-emulated-signal"
  4#else
  5#ifndef _SIGNAL_H
  6#define _SIGNAL_H
  7
  8#ifdef __cplusplus
  9extern "C" {
 10#endif
 11
 12#include <features.h>
 13
 14#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
 15 || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
 16 || defined(_BSD_SOURCE)
 17
 18#ifdef __wasilibc_unmodified_upstream /* WASI has no ucontext support */
 19#ifdef _GNU_SOURCE
 20#define __ucontext ucontext
 21#endif
 22
 23#define __NEED_size_t
 24#define __NEED_pid_t
 25#define __NEED_uid_t
 26#define __NEED_struct_timespec
 27#define __NEED_pthread_t
 28#define __NEED_pthread_attr_t
 29#define __NEED_time_t
 30#define __NEED_clock_t
 31#define __NEED_sigset_t
 32
 33#include <bits/alltypes.h>
 34
 35#define SIG_BLOCK     0
 36#define SIG_UNBLOCK   1
 37#define SIG_SETMASK   2
 38
 39#define SI_ASYNCNL (-60)
 40#define SI_TKILL (-6)
 41#define SI_SIGIO (-5)
 42#define SI_ASYNCIO (-4)
 43#define SI_MESGQ (-3)
 44#define SI_TIMER (-2)
 45#define SI_QUEUE (-1)
 46#define SI_USER 0
 47#define SI_KERNEL 128
 48
 49typedef struct sigaltstack stack_t;
 50#endif
 51
 52#endif
 53
 54#include <bits/signal.h>
 55
 56#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
 57 || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
 58 || defined(_BSD_SOURCE)
 59
 60#ifdef __wasilibc_unmodified_upstream /* WASI has no sigaction */
 61#define SIG_HOLD ((void (*)(int)) 2)
 62
 63#define FPE_INTDIV 1
 64#define FPE_INTOVF 2
 65#define FPE_FLTDIV 3
 66#define FPE_FLTOVF 4
 67#define FPE_FLTUND 5
 68#define FPE_FLTRES 6
 69#define FPE_FLTINV 7
 70#define FPE_FLTSUB 8
 71
 72#define ILL_ILLOPC 1
 73#define ILL_ILLOPN 2
 74#define ILL_ILLADR 3
 75#define ILL_ILLTRP 4
 76#define ILL_PRVOPC 5
 77#define ILL_PRVREG 6
 78#define ILL_COPROC 7
 79#define ILL_BADSTK 8
 80
 81#define SEGV_MAPERR 1
 82#define SEGV_ACCERR 2
 83#define SEGV_BNDERR 3
 84#define SEGV_PKUERR 4
 85#define SEGV_MTEAERR 8
 86#define SEGV_MTESERR 9
 87
 88#define BUS_ADRALN 1
 89#define BUS_ADRERR 2
 90#define BUS_OBJERR 3
 91#define BUS_MCEERR_AR 4
 92#define BUS_MCEERR_AO 5
 93
 94#define CLD_EXITED 1
 95#define CLD_KILLED 2
 96#define CLD_DUMPED 3
 97#define CLD_TRAPPED 4
 98#define CLD_STOPPED 5
 99#define CLD_CONTINUED 6
100
101union sigval {
102	int sival_int;
103	void *sival_ptr;
104};
105
106typedef struct {
107#ifdef __SI_SWAP_ERRNO_CODE
108	int si_signo, si_code, si_errno;
109#else
110	int si_signo, si_errno, si_code;
111#endif
112	union {
113		char __pad[128 - 2*sizeof(int) - sizeof(long)];
114		struct {
115			union {
116				struct {
117					pid_t si_pid;
118					uid_t si_uid;
119				} __piduid;
120				struct {
121					int si_timerid;
122					int si_overrun;
123				} __timer;
124			} __first;
125			union {
126				union sigval si_value;
127				struct {
128					int si_status;
129					clock_t si_utime, si_stime;
130				} __sigchld;
131			} __second;
132		} __si_common;
133		struct {
134			void *si_addr;
135			short si_addr_lsb;
136			union {
137				struct {
138					void *si_lower;
139					void *si_upper;
140				} __addr_bnd;
141				unsigned si_pkey;
142			} __first;
143		} __sigfault;
144		struct {
145			long si_band;
146			int si_fd;
147		} __sigpoll;
148		struct {
149			void *si_call_addr;
150			int si_syscall;
151			unsigned si_arch;
152		} __sigsys;
153	} __si_fields;
154} siginfo_t;
155#define si_pid     __si_fields.__si_common.__first.__piduid.si_pid
156#define si_uid     __si_fields.__si_common.__first.__piduid.si_uid
157#define si_status  __si_fields.__si_common.__second.__sigchld.si_status
158#define si_utime   __si_fields.__si_common.__second.__sigchld.si_utime
159#define si_stime   __si_fields.__si_common.__second.__sigchld.si_stime
160#define si_value   __si_fields.__si_common.__second.si_value
161#define si_addr    __si_fields.__sigfault.si_addr
162#define si_addr_lsb __si_fields.__sigfault.si_addr_lsb
163#define si_lower   __si_fields.__sigfault.__first.__addr_bnd.si_lower
164#define si_upper   __si_fields.__sigfault.__first.__addr_bnd.si_upper
165#define si_pkey    __si_fields.__sigfault.__first.si_pkey
166#define si_band    __si_fields.__sigpoll.si_band
167#define si_fd      __si_fields.__sigpoll.si_fd
168#define si_timerid __si_fields.__si_common.__first.__timer.si_timerid
169#define si_overrun __si_fields.__si_common.__first.__timer.si_overrun
170#define si_ptr     si_value.sival_ptr
171#define si_int     si_value.sival_int
172#define si_call_addr __si_fields.__sigsys.si_call_addr
173#define si_syscall __si_fields.__sigsys.si_syscall
174#define si_arch    __si_fields.__sigsys.si_arch
175
176struct sigaction {
177	union {
178		void (*sa_handler)(int);
179		void (*sa_sigaction)(int, siginfo_t *, void *);
180	} __sa_handler;
181	sigset_t sa_mask;
182	int sa_flags;
183	void (*sa_restorer)(void);
184};
185#define sa_handler   __sa_handler.sa_handler
186#define sa_sigaction __sa_handler.sa_sigaction
187
188#define SA_UNSUPPORTED 0x00000400
189#define SA_EXPOSE_TAGBITS 0x00000800
190
191struct sigevent {
192	union sigval sigev_value;
193	int sigev_signo;
194	int sigev_notify;
195	union {
196		char __pad[64 - 2*sizeof(int) - sizeof(union sigval)];
197		pid_t sigev_notify_thread_id;
198		struct {
199			void (*sigev_notify_function)(union sigval);
200			pthread_attr_t *sigev_notify_attributes;
201		} __sev_thread;
202	} __sev_fields;
203};
204
205#define sigev_notify_thread_id __sev_fields.sigev_notify_thread_id
206#define sigev_notify_function __sev_fields.__sev_thread.sigev_notify_function
207#define sigev_notify_attributes __sev_fields.__sev_thread.sigev_notify_attributes
208
209#define SIGEV_SIGNAL 0
210#define SIGEV_NONE 1
211#define SIGEV_THREAD 2
212#define SIGEV_THREAD_ID 4
213#endif
214
215#ifdef __wasilibc_unmodified_upstream /* WASI has no realtime signals */
216int __libc_current_sigrtmin(void);
217int __libc_current_sigrtmax(void);
218
219#define SIGRTMIN  (__libc_current_sigrtmin())
220#define SIGRTMAX  (__libc_current_sigrtmax())
221#endif
222
223#ifdef __wasilibc_unmodified_upstream /* WASI has no signals */
224int kill(pid_t, int);
225
226int sigemptyset(sigset_t *);
227int sigfillset(sigset_t *);
228int sigaddset(sigset_t *, int);
229int sigdelset(sigset_t *, int);
230int sigismember(const sigset_t *, int);
231
232int sigprocmask(int, const sigset_t *__restrict, sigset_t *__restrict);
233int sigsuspend(const sigset_t *);
234int sigaction(int, const struct sigaction *__restrict, struct sigaction *__restrict);
235int sigpending(sigset_t *);
236int sigwait(const sigset_t *__restrict, int *__restrict);
237int sigwaitinfo(const sigset_t *__restrict, siginfo_t *__restrict);
238int sigtimedwait(const sigset_t *__restrict, siginfo_t *__restrict, const struct timespec *__restrict);
239int sigqueue(pid_t, int, union sigval);
240#endif
241
242#ifdef __wasilibc_unmodified_upstream /* WASI has no threads yet */
243int pthread_sigmask(int, const sigset_t *__restrict, sigset_t *__restrict);
244int pthread_kill(pthread_t, int);
245#endif
246
247#ifdef __wasilibc_unmodified_upstream /* WASI has no siginfo */
248void psiginfo(const siginfo_t *, const char *);
249#endif
250void psignal(int, const char *);
251
252#endif
253
254#ifdef __wasilibc_unmodified_upstream /* WASI has no signals */
255#if defined(_XOPEN_SOURCE) || defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
256int killpg(pid_t, int);
257int sigaltstack(const stack_t *__restrict, stack_t *__restrict);
258int sighold(int);
259int sigignore(int);
260int siginterrupt(int, int);
261int sigpause(int);
262int sigrelse(int);
263void (*sigset(int, void (*)(int)))(int);
264#define TRAP_BRKPT 1
265#define TRAP_TRACE 2
266#define TRAP_BRANCH 3
267#define TRAP_HWBKPT 4
268#define TRAP_UNK 5
269#define POLL_IN 1
270#define POLL_OUT 2
271#define POLL_MSG 3
272#define POLL_ERR 4
273#define POLL_PRI 5
274#define POLL_HUP 6
275#define SS_ONSTACK    1
276#define SS_DISABLE    2
277#define SS_AUTODISARM (1U << 31)
278#define SS_FLAG_BITS SS_AUTODISARM
279#endif
280#endif
281
282#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
283#define NSIG _NSIG
284typedef void (*sig_t)(int);
285
286#define SYS_SECCOMP 1
287#define SYS_USER_DISPATCH 2
288#endif
289
290#ifdef _GNU_SOURCE
291typedef void (*sighandler_t)(int);
292void (*bsd_signal(int, void (*)(int)))(int);
293#ifdef __wasilibc_unmodified_upstream /* WASI has no signal sets */
294int sigisemptyset(const sigset_t *);
295int sigorset (sigset_t *, const sigset_t *, const sigset_t *);
296int sigandset(sigset_t *, const sigset_t *, const sigset_t *);
297
298#define SA_NOMASK SA_NODEFER
299#define SA_ONESHOT SA_RESETHAND
300#endif
301#endif
302
303#ifdef __wasilibc_unmodified_upstream /* 1 is a valid function pointer on wasm */
304#define SIG_ERR  ((void (*)(int))-1)
305#define SIG_DFL  ((void (*)(int)) 0)
306#define SIG_IGN  ((void (*)(int)) 1)
307#else
308void __SIG_ERR(int);
309void __SIG_IGN(int);
310#define SIG_ERR  (__SIG_ERR)
311#define SIG_DFL  ((void (*)(int)) 0)
312#define SIG_IGN  (__SIG_IGN)
313#endif
314
315#ifdef __wasilibc_unmodified_upstream /* Make sig_atomic_t 64-bit on wasm64 */
316typedef int sig_atomic_t;
317#else
318typedef long sig_atomic_t;
319#endif
320
321void (*signal(int, void (*)(int)))(int);
322int raise(int);
323
324#ifdef __wasilibc_unmodified_upstream /* WASI has no sigtimedwait */
325#if _REDIR_TIME64
326#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
327 || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
328 || defined(_BSD_SOURCE)
329__REDIR(sigtimedwait, __sigtimedwait_time64);
330#endif
331#endif
332#endif
333
334#ifdef __cplusplus
335}
336#endif
337
338#endif
339#endif