168d03aeaSderaadt #include <sys/types.h>
268d03aeaSderaadt #include <sys/signal.h>
3*ac336a76Sdavid #include <signal.h>
468d03aeaSderaadt #include <stdio.h>
568d03aeaSderaadt #include <unistd.h>
668d03aeaSderaadt #include <string.h>
768d03aeaSderaadt
868d03aeaSderaadt #define FAULTADDR 0x123123
968d03aeaSderaadt
10db3296cfSderaadt static void
handler(int sig,siginfo_t * sip,void * scp)1168d03aeaSderaadt handler(int sig, siginfo_t *sip, void *scp)
1268d03aeaSderaadt {
1368d03aeaSderaadt char buf[1024];
1468d03aeaSderaadt
1568d03aeaSderaadt if (sip == NULL)
1668d03aeaSderaadt _exit(1);
1768d03aeaSderaadt if (sip->si_addr == 0) /* wrong address */
1868d03aeaSderaadt _exit(1);
1968d03aeaSderaadt
2068d03aeaSderaadt // snprintf(buf, sizeof buf, "addr %p\n", sip->si_addr);
2168d03aeaSderaadt // write(STDOUT_FILENO, buf, strlen(buf));
2268d03aeaSderaadt _exit(0);
2368d03aeaSderaadt }
2468d03aeaSderaadt
2568d03aeaSderaadt
2668d03aeaSderaadt int
main(int argc,char * argv[])27db3296cfSderaadt main(int argc, char *argv[])
2868d03aeaSderaadt {
2968d03aeaSderaadt struct sigaction sa;
3068d03aeaSderaadt
3168d03aeaSderaadt memset(&sa, 0, sizeof sa);
32a22fe5cbSdavid sigfillset(&sa.sa_mask);
3368d03aeaSderaadt sa.sa_sigaction = handler;
3468d03aeaSderaadt sa.sa_flags = SA_SIGINFO;
3568d03aeaSderaadt
3668d03aeaSderaadt sigaction(SIGSEGV, &sa, NULL);
3768d03aeaSderaadt sigaction(SIGBUS, &sa, NULL);
3868d03aeaSderaadt
3968d03aeaSderaadt *(char *)FAULTADDR = 0;
4068d03aeaSderaadt }
41