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>
diff --git a/signal.c b/signal.c
index ce8ec0a..8ba38a8 100644
--- a/signal.c
+++ b/signal.c
@@ -499,6 +499,17 @@
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 @@
}
#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 @@
(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);
}
}