Mpersify parsers of getrusage, waitpid, wait4, and waitid syscalls

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.
This commit is contained in:
Дмитрий Левин 2015-07-18 00:19:50 +00:00
parent 3b7674c6df
commit 6fb8c6feb9
4 changed files with 51 additions and 47 deletions

1
defs.h
View File

@ -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

View File

@ -31,34 +31,39 @@
#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

View 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;
}

4
wait.c
View File

@ -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;