diff options
author | Elliott Hughes <enh@google.com> | 2014-03-10 19:27:22 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2014-03-10 19:33:49 +0000 |
commit | 4dd1e89cb87c9af63da7b18f1251ad446527c9e0 (patch) | |
tree | 6e36af1ccb25b7d652fcef6becfde5535daae30c | |
parent | 7a28f7f128fcca6ef0010b98cb21adcf8c3b8ae1 (diff) | |
download | strace-4dd1e89cb87c9af63da7b18f1251ad446527c9e0.tar.gz strace-4dd1e89cb87c9af63da7b18f1251ad446527c9e0.tar.bz2 strace-4dd1e89cb87c9af63da7b18f1251ad446527c9e0.tar.xz |
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 <enh@google.com>
-rw-r--r-- | signal.c | 42 |
1 files changed, 25 insertions, 17 deletions
@@ -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); } } |