summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2014-03-10 19:27:22 +0000
committerDmitry V. Levin <ldv@altlinux.org>2014-03-10 19:33:49 +0000
commit4dd1e89cb87c9af63da7b18f1251ad446527c9e0 (patch)
tree6e36af1ccb25b7d652fcef6becfde5535daae30c
parent7a28f7f128fcca6ef0010b98cb21adcf8c3b8ae1 (diff)
downloadstrace-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.c42
1 files 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);
}
}