xref: /openbsd-src/regress/lib/libpthread/siginfo/siginfo.c (revision b17f6c98146ddc0e3530670a34673ab2c9ea67e8)
1*b17f6c98Sclaudio /* $OpenBSD: siginfo.c,v 1.12 2024/08/29 15:16:43 claudio Exp $ */
219eec2e2Smarc /* PUBLIC DOMAIN Oct 2002 <marc@snafu.org> */
319eec2e2Smarc 
48cda8cd1Smarc /*
58cda8cd1Smarc  * test SA_SIGINFO support.   Also check that SA_RESETHAND does the right
68cda8cd1Smarc  * thing.
78cda8cd1Smarc  */
819eec2e2Smarc 
919eec2e2Smarc #include <signal.h>
1019eec2e2Smarc #include <stdio.h>
11787c109eSmarc #include <unistd.h>
12db3296cfSderaadt #include <stdlib.h>
1319eec2e2Smarc 
1419eec2e2Smarc #include "test.h"
1519eec2e2Smarc 
16787c109eSmarc #define BOGUS	(char *)0x987230
17787c109eSmarc 
18db3296cfSderaadt static void
1919eec2e2Smarc act_handler(int signal, siginfo_t *siginfo, void *context)
2019eec2e2Smarc {
21477a56a0Smarc 	struct sigaction sa;
22477a56a0Smarc 
23477a56a0Smarc 	CHECKe(sigaction(SIGSEGV, NULL, &sa));
24477a56a0Smarc 	ASSERT(sa.sa_handler == SIG_DFL);
253987246bSmarc 	ASSERT(siginfo != NULL);
26*b17f6c98Sclaudio 	dprintf(STDOUT_FILENO, "act_handler: signal %d, siginfo %p, "
27*b17f6c98Sclaudio 		 "context %p\naddr %p, code %d, trap %d\n", signal, siginfo,
28*b17f6c98Sclaudio 		 context, siginfo->si_addr, siginfo->si_code,
29*b17f6c98Sclaudio 		 siginfo->si_trapno);
3024208248Smarc  	ASSERT(siginfo->si_addr == BOGUS);
3193deff90Sguenther 	ASSERT(siginfo->si_code == SEGV_MAPERR ||
3293deff90Sguenther 	       siginfo->si_code == SEGV_ACCERR);
33787c109eSmarc 	SUCCEED;
3419eec2e2Smarc }
3519eec2e2Smarc 
3619eec2e2Smarc int
3719eec2e2Smarc main(int argc, char **argv)
3819eec2e2Smarc {
3919eec2e2Smarc 	struct sigaction act;
4019eec2e2Smarc 
4119eec2e2Smarc 	act.sa_sigaction = act_handler;
4219eec2e2Smarc 	sigemptyset(&act.sa_mask);
43787c109eSmarc 	act.sa_flags = SA_SIGINFO | SA_RESETHAND | SA_NODEFER;
4419eec2e2Smarc 	CHECKe(sigaction(SIGSEGV, &act, NULL));
45787c109eSmarc 	*BOGUS = 1;
46787c109eSmarc 	PANIC("How did we get here?");
4719eec2e2Smarc }
48