]> granicus.if.org Git - strace/commitdiff
Mpersify parsers of getrusage, waitpid, wait4, and waitid syscalls
authorDmitry V. Levin <ldv@altlinux.org>
Sat, 18 Jul 2015 00:19:50 +0000 (00:19 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Fri, 28 Aug 2015 08:46:23 +0000 (08:46 +0000)
Fix multiple personalities support in parsers of getrusage, waitpid,
wait4, and waitid syscalls by converting printrusage into a mpersified
printer.

* defs.h (printrusage): Remove.
* printrusage.c (rusage_t): New typedef.  Mpersify it.
(printrusage): Use it instead of struct rusage.
Wrap function name into MPERS_PRINTER_DECL.
* resource.c (sys_getrusage): Use mpersified printrusage.
* wait.c (printwaitn, sys_waitid): Likewise.

defs.h
printrusage.c
resource.c
wait.c

diff --git a/defs.h b/defs.h
index c2c44b349e82cf117321f941931f581c4c68f7dd..04653c01bd2a1c2e79c9e76c603e47eee4045662 100644 (file)
--- a/defs.h
+++ b/defs.h
@@ -635,7 +635,6 @@ extern bool print_sockaddr_by_inode(const unsigned long, const char *);
 extern void print_dirfd(struct tcb *, int);
 extern void printsock(struct tcb *, long, int);
 extern void print_sock_optmgmt(struct tcb *, long, int);
-extern void printrusage(struct tcb *, long);
 #ifdef ALPHA
 extern void printrusage32(struct tcb *, long);
 #endif
index 7661e7d121dd7b463fc2e777ca3a91c7964fb5e3..be56e66ff9c56020d1d7218befa0b209636699c8 100644 (file)
 #include "defs.h"
 #include <sys/resource.h>
 
-void
-printrusage(struct tcb *tcp, long addr)
+#include DEF_MPERS_TYPE(rusage_t)
+
+typedef struct rusage rusage_t;
+
+#include MPERS_DEFS
+
+MPERS_PRINTER_DECL(void, printrusage)(struct tcb *tcp, long addr)
 {
-       struct rusage ru;
+       rusage_t ru;
 
        if (umove_or_printaddr(tcp, addr, &ru))
                return;
-       if (!abbrev(tcp)) {
-               tprintf("{ru_utime={%lu, %lu}, ru_stime={%lu, %lu}, ",
-                       (long) ru.ru_utime.tv_sec, (long) ru.ru_utime.tv_usec,
-                       (long) ru.ru_stime.tv_sec, (long) ru.ru_stime.tv_usec);
-               tprintf("ru_maxrss=%lu, ru_ixrss=%lu, ",
-                       ru.ru_maxrss, ru.ru_ixrss);
-               tprintf("ru_idrss=%lu, ru_isrss=%lu, ",
-                       ru.ru_idrss, ru.ru_isrss);
-               tprintf("ru_minflt=%lu, ru_majflt=%lu, ru_nswap=%lu, ",
-                       ru.ru_minflt, ru.ru_majflt, ru.ru_nswap);
-               tprintf("ru_inblock=%lu, ru_oublock=%lu, ",
-                       ru.ru_inblock, ru.ru_oublock);
-               tprintf("ru_msgsnd=%lu, ru_msgrcv=%lu, ",
-                       ru.ru_msgsnd, ru.ru_msgrcv);
-               tprintf("ru_nsignals=%lu, ru_nvcsw=%lu, ru_nivcsw=%lu}",
-                       ru.ru_nsignals, ru.ru_nvcsw, ru.ru_nivcsw);
-       }
+
+       tprintf("{ru_utime={%lu, %lu}, ru_stime={%lu, %lu}, ",
+               (long) ru.ru_utime.tv_sec, (long) ru.ru_utime.tv_usec,
+               (long) ru.ru_stime.tv_sec, (long) ru.ru_stime.tv_usec);
+       if (abbrev(tcp))
+               tprints("...}");
        else {
-               tprintf("{ru_utime={%lu, %lu}, ru_stime={%lu, %lu}, ...}",
-                       (long) ru.ru_utime.tv_sec, (long) ru.ru_utime.tv_usec,
-                       (long) ru.ru_stime.tv_sec, (long) ru.ru_stime.tv_usec);
+               tprintf("ru_maxrss=%lu, ", (long) ru.ru_maxrss);
+               tprintf("ru_ixrss=%lu, ", (long) ru.ru_ixrss);
+               tprintf("ru_idrss=%lu, ", (long) ru.ru_idrss);
+               tprintf("ru_isrss=%lu, ", (long) ru.ru_isrss);
+               tprintf("ru_minflt=%lu, ", (long) ru.ru_minflt);
+               tprintf("ru_majflt=%lu, ", (long) ru.ru_majflt);
+               tprintf("ru_nswap=%lu, ", (long) ru.ru_nswap);
+               tprintf("ru_inblock=%lu, ", (long) ru.ru_inblock);
+               tprintf("ru_oublock=%lu, ", (long) ru.ru_oublock);
+               tprintf("ru_msgsnd=%lu, ", (long) ru.ru_msgsnd);
+               tprintf("ru_msgrcv=%lu, ", (long) ru.ru_msgrcv);
+               tprintf("ru_nsignals=%lu, ", (long) ru.ru_nsignals);
+               tprintf("ru_nvcsw=%lu, ", (long) ru.ru_nvcsw);
+               tprintf("ru_nivcsw=%lu}", (long) ru.ru_nivcsw);
        }
 }
 
@@ -91,27 +96,27 @@ printrusage32(struct tcb *tcp, long addr)
 
        if (umove_or_printaddr(tcp, addr, &ru))
                return;
-       if (!abbrev(tcp)) {
-               tprintf("{ru_utime={%lu, %lu}, ru_stime={%lu, %lu}, ",
-                       (long) ru.ru_utime.tv_sec, (long) ru.ru_utime.tv_usec,
-                       (long) ru.ru_stime.tv_sec, (long) ru.ru_stime.tv_usec);
-               tprintf("ru_maxrss=%lu, ru_ixrss=%lu, ",
-                       ru.ru_maxrss, ru.ru_ixrss);
-               tprintf("ru_idrss=%lu, ru_isrss=%lu, ",
-                       ru.ru_idrss, ru.ru_isrss);
-               tprintf("ru_minflt=%lu, ru_majflt=%lu, ru_nswap=%lu, ",
-                       ru.ru_minflt, ru.ru_majflt, ru.ru_nswap);
-               tprintf("ru_inblock=%lu, ru_oublock=%lu, ",
-                       ru.ru_inblock, ru.ru_oublock);
-               tprintf("ru_msgsnd=%lu, ru_msgrcv=%lu, ",
-                       ru.ru_msgsnd, ru.ru_msgrcv);
-               tprintf("ru_nsignals=%lu, ru_nvcsw=%lu, ru_nivcsw=%lu}",
-                       ru.ru_nsignals, ru.ru_nvcsw, ru.ru_nivcsw);
-       }
+
+       tprintf("{ru_utime={%lu, %lu}, ru_stime={%lu, %lu}, ",
+               (long) ru.ru_utime.tv_sec, (long) ru.ru_utime.tv_usec,
+               (long) ru.ru_stime.tv_sec, (long) ru.ru_stime.tv_usec);
+       if (abbrev(tcp))
+               tprints("...}");
        else {
-               tprintf("{ru_utime={%lu, %lu}, ru_stime={%lu, %lu}, ...}",
-                       (long) ru.ru_utime.tv_sec, (long) ru.ru_utime.tv_usec,
-                       (long) ru.ru_stime.tv_sec, (long) ru.ru_stime.tv_usec);
+               tprintf("ru_maxrss=%lu, ", ru.ru_maxrss);
+               tprintf("ru_ixrss=%lu, ", ru.ru_ixrss);
+               tprintf("ru_idrss=%lu, ", ru.ru_idrss);
+               tprintf("ru_isrss=%lu, ", ru.ru_isrss);
+               tprintf("ru_minflt=%lu, ", ru.ru_minflt);
+               tprintf("ru_majflt=%lu, ", ru.ru_majflt);
+               tprintf("ru_nswap=%lu, ", ru.ru_nswap);
+               tprintf("ru_inblock=%lu, ", ru.ru_inblock);
+               tprintf("ru_oublock=%lu, ", ru.ru_oublock);
+               tprintf("ru_msgsnd=%lu, ", ru.ru_msgsnd);
+               tprintf("ru_msgrcv=%lu, ", ru.ru_msgrcv);
+               tprintf("ru_nsignals=%lu, ", ru.ru_nsignals);
+               tprintf("ru_nvcsw=%lu, ", ru.ru_nvcsw);
+               tprintf("ru_nivcsw=%lu}", ru.ru_nivcsw);
        }
 }
 #endif
index c68f0456e51eba102b6ea7a4eaab699034075fbc..be44aa92796dce6d9083e292d3b19c324165361e 100644 (file)
@@ -162,7 +162,7 @@ SYS_FUNC(getrusage)
                tprints(", ");
        }
        else
-               printrusage(tcp, tcp->u_arg[1]);
+               MPERS_PRINTER_NAME(printrusage)(tcp, tcp->u_arg[1]);
        return 0;
 }
 
diff --git a/wait.c b/wait.c
index 928f3dedef71caa0ffeb1852f605ed6ac8de2b9d..07cc36148205529e48210cf192f73902d338c600 100644 (file)
--- a/wait.c
+++ b/wait.c
@@ -114,7 +114,7 @@ printwaitn(struct tcb *tcp, int n, int bitness)
                                        printrusage32(tcp, tcp->u_arg[3]);
                                else
 #endif
-                                       printrusage(tcp, tcp->u_arg[3]);
+                                       MPERS_PRINTER_NAME(printrusage)(tcp, tcp->u_arg[3]);
                        }
                        else
                                printaddr(tcp->u_arg[3]);
@@ -156,7 +156,7 @@ SYS_FUNC(waitid)
                if (tcp->s_ent->nargs > 4) {
                        /* usage */
                        tprints(", ");
-                       printrusage(tcp, tcp->u_arg[4]);
+                       MPERS_PRINTER_NAME(printrusage)(tcp, tcp->u_arg[4]);
                }
        }
        return 0;