46 lines
907 B
C
46 lines
907 B
C
#include <ft/test.h>
|
|
#include <ft/all-tests.h>
|
|
#include <signal.h>
|
|
#include <setjmp.h>
|
|
|
|
static volatile sig_atomic_t last_signum = 0;
|
|
static jmp_buf jb;
|
|
|
|
void handler(int signum)
|
|
{
|
|
last_signum = signum;
|
|
}
|
|
|
|
void handler2(int signum)
|
|
{
|
|
longjmp(jb, signum);
|
|
}
|
|
|
|
void _ft_signal_signal(ft_test *t)
|
|
{
|
|
__sighandler_t prev;
|
|
|
|
ft_assert(t, signal(192548, SIG_IGN) == SIG_ERR);
|
|
signal(SIGINT, SIG_DFL);
|
|
|
|
/* Call an ignored signal */
|
|
prev = signal(SIGINT, SIG_IGN);
|
|
ft_assert(t, prev == SIG_DFL && raise(SIGINT) == 0);
|
|
|
|
/* Call a normal handler */
|
|
prev = signal(SIGINT, handler);
|
|
raise(SIGINT);
|
|
ft_assert(t, prev == SIG_IGN && last_signum == SIGINT);
|
|
|
|
/* longjmp() out of a signal handler (same thread) */
|
|
signal(SIGINT, handler2);
|
|
int rc = setjmp(jb);
|
|
if(!rc) raise(SIGINT);
|
|
else ft_assert(t, rc == SIGINT);
|
|
}
|
|
|
|
ft_test ft_signal_signal = {
|
|
.name = "Signal basics",
|
|
.function = _ft_signal_signal,
|
|
};
|