Improve SI_TIMER decoding
authorElliott Hughes <enh@google.com>
Mon, 10 Mar 2014 19:27:22 +0000 (19:27 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Mon, 10 Mar 2014 19:33:49 +0000 (19:33 +0000)
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>
signal.c

index ce8ec0a4e3fd3b62c3484e114e50d778464db93f..8ba38a8077f6204e9db3cd768b045cb13afea9b9 100644 (file)
--- 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);
 
                        }
                }