| /* Test of correct simulation for uc->uc_link in a signal handler. */ |
| |
| #include <assert.h> |
| #include <signal.h> |
| #include <stdio.h> |
| #include <ucontext.h> |
| |
| static void sighandler(int sig, siginfo_t *sip, ucontext_t *ucp) |
| { |
| ucontext_t uc2; |
| |
| /* Current uc_link value has to be equal to ucp. */ |
| getcontext(&uc2); |
| assert(uc2.uc_link == ucp); |
| } |
| |
| int main(void) |
| { |
| ucontext_t uc; |
| struct sigaction sa; |
| |
| /* Current uc_link value has to be NULL. */ |
| if (getcontext(&uc)) { |
| perror("getcontext"); |
| return 1; |
| } |
| assert(!uc.uc_link); |
| |
| sa.sa_handler = sighandler; |
| sa.sa_flags = SA_SIGINFO; |
| if (sigfillset(&sa.sa_mask)) { |
| perror("sigfillset"); |
| return 1; |
| } |
| if (sigaction(SIGUSR1, &sa, NULL)) { |
| perror("sigaction"); |
| return 1; |
| } |
| |
| raise(SIGUSR1); |
| |
| /* Current uc_link value has to be NULL. */ |
| getcontext(&uc); |
| assert(!uc.uc_link); |
| |
| return 0; |
| } |
| |