From 4dd1e89cb87c9af63da7b18f1251ad446527c9e0 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Mon, 10 Mar 2014 19:27:22 +0000 Subject: Improve SI_TIMER decoding Decode siginfo_t more clearly for si_code SI_TIMER. The 'pid' is actually a POSIX timer id, and the 'uid' is actually the overrun. Also factor out the si_value dumping so it's the same for every si_code. Signed-off-by: Elliott Hughes --- signal.c | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/signal.c b/signal.c index ce8ec0a..8ba38a8 100644 --- a/signal.c +++ b/signal.c @@ -499,6 +499,17 @@ static const struct xlat sigbus_codes[] = { XLAT_END }; +static void +printsigval(siginfo_t *sip, int verbose) +{ + if (!verbose) + tprints(", ..."); + else + tprintf(", si_value={int=%u, ptr=%#lx}", + sip->si_int, + (unsigned long) sip->si_ptr); +} + void printsiginfo(siginfo_t *sip, int verbose) { @@ -561,32 +572,35 @@ printsiginfo(siginfo_t *sip, int verbose) } #ifdef SI_FROMUSER if (SI_FROMUSER(sip)) { - tprintf(", si_pid=%lu, si_uid=%lu", - (unsigned long) sip->si_pid, - (unsigned long) sip->si_uid); switch (sip->si_code) { #ifdef SI_USER case SI_USER: + tprintf(", si_pid=%lu, si_uid=%lu", + (unsigned long) sip->si_pid, + (unsigned long) sip->si_uid); break; #endif #ifdef SI_TKILL case SI_TKILL: + tprintf(", si_pid=%lu, si_uid=%lu", + (unsigned long) sip->si_pid, + (unsigned long) sip->si_uid); break; #endif #ifdef SI_TIMER case SI_TIMER: - tprintf(", si_value=%d", sip->si_int); + tprintf(", si_timerid=%#x, si_overrun=%d", + sip->si_timerid, sip->si_overrun); + printsigval(sip, verbose); break; #endif default: + tprintf(", si_pid=%lu, si_uid=%lu", + (unsigned long) sip->si_pid, + (unsigned long) sip->si_uid); if (!sip->si_ptr) break; - if (!verbose) - tprints(", ..."); - else - tprintf(", si_value={int=%u, ptr=%#lx}", - sip->si_int, - (unsigned long) sip->si_ptr); + printsigval(sip, verbose); break; } } @@ -628,13 +642,7 @@ printsiginfo(siginfo_t *sip, int verbose) (unsigned long) sip->si_uid); if (!sip->si_ptr) break; - if (!verbose) - tprints(", ..."); - else { - tprintf(", si_value={int=%u, ptr=%#lx}", - sip->si_int, - (unsigned long) sip->si_ptr); - } + printsigval(sip, verbose); } } -- cgit v1.2.3