blob: dbd9f1cde02898a1d3246a68ea93260b39aaba60 [file] [edit]
/*
* Copyright 2021 The Emscripten Authors. All rights reserved.
* Emscripten is available under two separate licenses, the MIT license and the
* University of Illinois/NCSA Open Source License. Both these licenses can be
* found in the LICENSE file.
*/
#define _GNU_SOURCE // for sighandler_t
#include <stdbool.h>
#include <stddef.h>
#include <signal.h>
extern struct sigaction __sig_actions[_NSIG];
extern sigset_t __sig_pending;
bool __sig_is_blocked(int sig);
extern void __call_sighandler(sighandler_t handler, int sig);
int raise(int sig) {
if (__sig_is_blocked(sig)) {
sigaddset(&__sig_pending, sig);
return 0;
}
if (__sig_actions[sig].sa_flags & SA_SIGINFO) {
siginfo_t t = {0};
__sig_actions[sig].sa_sigaction(sig, &t, NULL);
} else {
if (__sig_actions[sig].sa_handler == SIG_DFL || __sig_actions[sig].sa_handler == SIG_IGN) {
return 0;
}
// Avoid a direct call to the handler, and instead call via JS so we can
// avoid strict signature checking.
// https://github.com/emscripten-core/posixtestsuite/issues/6
__call_sighandler(__sig_actions[sig].sa_handler, sig);
}
return 0;
}