mirror of https://github.com/WebAssembly/wasi-sdk
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.3 KiB
87 lines
2.3 KiB
#ifdef NDEBUG
|
|
#undef NDEBUG
|
|
#endif
|
|
|
|
#include <signal.h>
|
|
#include <string.h>
|
|
#include <assert.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <errno.h>
|
|
|
|
// Make sure this exists.
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-W#warnings"
|
|
#include <sys/signal.h>
|
|
#pragma clang diagnostic pop
|
|
|
|
volatile sig_atomic_t flag = 0;
|
|
|
|
static void handler(int n) {
|
|
// This is undefined behavior by the spec, but this is just a testcase.
|
|
fflush(stdout);
|
|
printf("handler for signal %s\n", strsignal(n));
|
|
fflush(stdout);
|
|
flag = 1;
|
|
}
|
|
|
|
int main(void) {
|
|
// Test various raise cases that don't abort.
|
|
assert(raise(SIGCHLD) == 0);
|
|
#ifdef SIGCLD
|
|
assert(raise(SIGCLD) == 0);
|
|
#endif
|
|
assert(raise(SIGURG) == 0);
|
|
assert(raise(SIGWINCH) == 0);
|
|
|
|
errno = 0;
|
|
assert(raise(_NSIG) == -1 && errno == EINVAL);
|
|
|
|
// Test psignal.
|
|
psignal(SIGINT, "psignal message for SIGINT");
|
|
|
|
// Test strsignal.
|
|
printf("strsignal for SIGHUP: '%s'\n", strsignal(SIGHUP));
|
|
|
|
// Some signals can't be ignored.
|
|
errno = 0;
|
|
assert(signal(SIGKILL, SIG_IGN) == SIG_ERR && errno == EINVAL);
|
|
errno = 0;
|
|
assert(signal(SIGSTOP, SIG_IGN) == SIG_ERR && errno == EINVAL);
|
|
|
|
// Test that all the C-standard-required signals can be
|
|
// ignored with `SIG_IGN`.
|
|
int some_fatal_sigs[] = {
|
|
SIGINT, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM
|
|
};
|
|
for (size_t i = 0;
|
|
i < sizeof(some_fatal_sigs) / sizeof(some_fatal_sigs[0]);
|
|
++i)
|
|
{
|
|
int sig = some_fatal_sigs[i];
|
|
assert(signal(sig, SIG_IGN) == SIG_DFL);
|
|
raise(sig);
|
|
assert(signal(sig, SIG_DFL) == SIG_IGN);
|
|
assert(signal(sig, SIG_DFL) == SIG_DFL);
|
|
}
|
|
|
|
// Install a handler and invoke it.
|
|
printf("beginning handler test:\n");
|
|
assert(signal(SIGWINCH, handler) == SIG_DFL);
|
|
fflush(stdout);
|
|
assert(raise(SIGWINCH) == 0);
|
|
fflush(stdout);
|
|
assert(flag == 1);
|
|
printf("finished handler test\n");
|
|
|
|
// Check various API invariants.
|
|
assert(signal(SIGWINCH, SIG_IGN) == handler);
|
|
assert(raise(SIGWINCH) == 0);
|
|
assert(signal(SIGWINCH, SIG_DFL) == SIG_IGN);
|
|
assert(raise(SIGWINCH) == 0);
|
|
assert(signal(SIGWINCH, SIG_DFL) == SIG_DFL);
|
|
assert(raise(SIGWINCH) == 0);
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|