1/* $OpenBSD: siginfo.c,v 1.11 2016/09/01 11:04:37 guenther Exp $ */ 2/* PUBLIC DOMAIN Oct 2002 <marc@snafu.org> */ 3 4/* 5 * test SA_SIGINFO support. Also check that SA_RESETHAND does the right 6 * thing. 7 */ 8 9#include <signal.h> 10#include <stdio.h> 11#include <unistd.h> 12#include <stdlib.h> 13 14#include "test.h" 15 16#define BOGUS (char *)0x987230 17 18static void 19act_handler(int signal, siginfo_t *siginfo, void *context) 20{ 21 struct sigaction sa; 22 char * str; 23 24 CHECKe(sigaction(SIGSEGV, NULL, &sa)); 25 ASSERT(sa.sa_handler == SIG_DFL); 26 ASSERT(siginfo != NULL); 27 asprintf(&str, "act_handler: signal %d, siginfo %p, context %p\n" 28 "addr %p, code %d, trap %d\n", signal, siginfo, context, 29 siginfo->si_addr, siginfo->si_code, siginfo->si_trapno); 30 write(STDOUT_FILENO, str, strlen(str)); 31 free(str); 32 ASSERT(siginfo->si_addr == BOGUS); 33 ASSERT(siginfo->si_code == SEGV_MAPERR || 34 siginfo->si_code == SEGV_ACCERR); 35 SUCCEED; 36} 37 38int 39main(int argc, char **argv) 40{ 41 struct sigaction act; 42 43 act.sa_sigaction = act_handler; 44 sigemptyset(&act.sa_mask); 45 act.sa_flags = SA_SIGINFO | SA_RESETHAND | SA_NODEFER; 46 CHECKe(sigaction(SIGSEGV, &act, NULL)); 47 *BOGUS = 1; 48 PANIC("How did we get here?"); 49} 50