diff --git a/CMakeLists.txt b/CMakeLists.txt index f800887..ae6998b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,8 @@ set(SOURCES src/setjmp/interrupt.c src/setjmp/massive.c src/setjmp/simple.c + # signal + src/signal/signal.c # stdlib src/stdlib/arith.c src/stdlib/fpconv.c diff --git a/include/ft/all-tests.h b/include/ft/all-tests.h index f31cfb1..78daeb9 100644 --- a/include/ft/all-tests.h +++ b/include/ft/all-tests.h @@ -20,6 +20,9 @@ extern ft_test ft_setjmp_simple; extern ft_test ft_setjmp_massive; extern ft_test ft_setjmp_interrupt; +/* signal */ +extern ft_test ft_signal_signal; + /* stdlib */ extern ft_test ft_stdlib_arith; extern ft_test ft_stdlib_sizes; diff --git a/src/main.c b/src/main.c index 9c6ca43..4ea3013 100644 --- a/src/main.c +++ b/src/main.c @@ -34,7 +34,10 @@ ft_list headers_libc[] = { &ft_setjmp_interrupt, NULL, }}, - { "", NULL }, + { "", (ft_test*[]){ + &ft_signal_signal, + NULL, + }}, { "", NULL }, { "", (ft_test*[]){ &ft_stdlib_arith, diff --git a/src/signal/signal.c b/src/signal/signal.c new file mode 100644 index 0000000..fe57769 --- /dev/null +++ b/src/signal/signal.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include + +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, +};