=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/kdump/kdump.c,v retrieving revision 1.152 retrieving revision 1.153 diff -u -r1.152 -r1.153 --- src/usr.bin/kdump/kdump.c 2022/12/20 21:44:19 1.152 +++ src/usr.bin/kdump/kdump.c 2022/12/29 01:36:36 1.153 @@ -1,4 +1,4 @@ -/* $OpenBSD: kdump.c,v 1.152 2022/12/20 21:44:19 guenther Exp $ */ +/* $OpenBSD: kdump.c,v 1.153 2022/12/29 01:36:36 guenther Exp $ */ /*- * Copyright (c) 1988, 1993 @@ -1320,60 +1320,84 @@ showbuf(dp, datalen); } -static void -ktrpsig(struct ktr_psig *psig) +void +siginfo(const siginfo_t *si, int show_signo) { - signame(psig->signo); - printf(" "); - if (psig->action == SIG_DFL) - (void)printf("SIG_DFL"); - else { - (void)printf("caught handler=0x%lx mask=", - (u_long)psig->action); - sigset(psig->mask); + if (show_signo) { + printf("signo="); + signame(si->si_signo); } - if (psig->code) { - printf(" code "); - if (fancy) { - switch (psig->signo) { + if (si->si_code) { + printf(" code="); + if (!fancy) + printf("<%d>", si->si_code); + else { + switch (si->si_signo) { case SIGILL: - sigill_name(psig->code); + sigill_name(si->si_code); break; case SIGTRAP: - sigtrap_name(psig->code); + sigtrap_name(si->si_code); break; case SIGEMT: - sigemt_name(psig->code); + sigemt_name(si->si_code); break; case SIGFPE: - sigfpe_name(psig->code); + sigfpe_name(si->si_code); break; case SIGBUS: - sigbus_name(psig->code); + sigbus_name(si->si_code); break; case SIGSEGV: - sigsegv_name(psig->code); + sigsegv_name(si->si_code); break; case SIGCHLD: - sigchld_name(psig->code); + sigchld_name(si->si_code); break; + default: + printf("<%d>", si->si_code); + break; } } - printf("<%d>", psig->code); } - switch (psig->signo) { + switch (si->si_signo) { case SIGSEGV: case SIGILL: case SIGBUS: case SIGFPE: - printf(" addr=%p trapno=%d", psig->si.si_addr, - psig->si.si_trapno); + printf(" addr=%p trapno=%d", si->si_addr, si->si_trapno); break; + case SIGCHLD: + if (si->si_code == CLD_EXITED) { + printf(" status=%d", si->si_status); + if (si->si_status < 0 || si->si_status > 9) + (void)printf("/%#x", si->si_status); + } else { + printf(" status="); + signame(si->si_status); + } + printf(" pid=%d uid=", si->si_pid); + uidname(si->si_uid); + break; default: break; } - printf("\n"); +} + +static void +ktrpsig(struct ktr_psig *psig) +{ + signame(psig->signo); + printf(" "); + if (psig->action == SIG_DFL) + printf("SIG_DFL"); + else { + printf("caught handler=0x%lx mask=", (u_long)psig->action); + sigset(psig->mask); + } + siginfo(&psig->si, 0); + putchar('\n'); } static void