From: Dmitry V. Levin Date: Mon, 3 Aug 2015 22:52:40 +0000 (+0300) Subject: Mpersify parsers of utimes, futimesat, and utimensat syscalls X-Git-Tag: v4.11~242 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b5a23ed3814ba3513bad9cbc99ceb9e152824e39;p=strace Mpersify parsers of utimes, futimesat, and utimensat syscalls Fix multiple personalities support in parsers of utimes, futimesat, and utimensat syscalls by introducing two mpersified printers: print_timeval_pair and print_timespec_utime_pair. * print_time.c: New file. * Makefile.am (strace_SOURCES): Add it. * utimes.c (decode_utimes): Remove. (sys_utimes, sys_futimesat): Use print_timeval_pair instead of decode_utimes. (sys_utimensat): Use print_timespec_utime_pair instead of decode_utimes. --- diff --git a/Makefile.am b/Makefile.am index b0d91562..6cc0a086 100644 --- a/Makefile.am +++ b/Makefile.am @@ -99,6 +99,7 @@ strace_SOURCES = \ prctl.c \ print_mq_attr.c \ print_msgbuf.c \ + print_time.c \ printmode.c \ printrusage.c \ printsiginfo.c \ diff --git a/print_time.c b/print_time.c new file mode 100644 index 00000000..5cdcc387 --- /dev/null +++ b/print_time.c @@ -0,0 +1,67 @@ +#include "defs.h" + +#include DEF_MPERS_TYPE(timespec_t) +#include DEF_MPERS_TYPE(timeval_t) + +typedef struct timespec timespec_t; +typedef struct timeval timeval_t; + +#include MPERS_DEFS + +#ifndef UTIME_NOW +# define UTIME_NOW ((1l << 30) - 1l) +#endif +#ifndef UTIME_OMIT +# define UTIME_OMIT ((1l << 30) - 2l) +#endif + +static void +print_timespec_t_utime(struct tcb *tcp, const timespec_t *t) +{ + switch (t->tv_nsec) { + case UTIME_NOW: + tprints("UTIME_NOW"); + break; + case UTIME_OMIT: + tprints("UTIME_OMIT"); + break; + default: + tprintf("{%jd, %jd}", + (intmax_t) t->tv_sec, (intmax_t) t->tv_nsec); + break; + } +} + +static void +print_timeval_t(struct tcb *tcp, const timeval_t *t) +{ + tprintf("{%jd, %jd}", (intmax_t) t->tv_sec, (intmax_t) t->tv_usec); +} + +MPERS_PRINTER_DECL(void, print_timespec_utime_pair)(struct tcb *tcp, const long addr) +{ + timespec_t t[2]; + + if (umove_or_printaddr(tcp, addr, &t)) + return; + + tprints("["); + print_timespec_t_utime(tcp, &t[0]); + tprints(", "); + print_timespec_t_utime(tcp, &t[1]); + tprints("]"); +} + +MPERS_PRINTER_DECL(void, print_timeval_pair)(struct tcb *tcp, const long addr) +{ + timeval_t t[2]; + + if (umove_or_printaddr(tcp, addr, &t)) + return; + + tprints("["); + print_timeval_t(tcp, &t[0]); + tprints(", "); + print_timeval_t(tcp, &t[1]); + tprints("]"); +} diff --git a/utimes.c b/utimes.c index e3a93392..f8ef9540 100644 --- a/utimes.c +++ b/utimes.c @@ -1,27 +1,10 @@ #include "defs.h" -static void -decode_utimes(struct tcb *tcp, int offset, int special) -{ - printpath(tcp, tcp->u_arg[offset]); - tprints(", "); - if (tcp->u_arg[offset + 1] == 0) - tprints("NULL"); - else { - tprints("["); - printtv_bitness(tcp, tcp->u_arg[offset + 1], - BITNESS_CURRENT, special); - tprints(", "); - printtv_bitness(tcp, tcp->u_arg[offset + 1] - + sizeof(struct timeval), - BITNESS_CURRENT, special); - tprints("]"); - } -} - SYS_FUNC(utimes) { - decode_utimes(tcp, 0, 0); + printpath(tcp, tcp->u_arg[0]); + tprints(", "); + MPERS_PRINTER_NAME(print_timeval_pair)(tcp, tcp->u_arg[1]); return RVAL_DECODED; } @@ -29,7 +12,9 @@ SYS_FUNC(utimes) SYS_FUNC(futimesat) { print_dirfd(tcp, tcp->u_arg[0]); - decode_utimes(tcp, 1, 0); + printpath(tcp, tcp->u_arg[1]); + tprints(", "); + MPERS_PRINTER_NAME(print_timeval_pair)(tcp, tcp->u_arg[2]); return RVAL_DECODED; } @@ -37,7 +22,9 @@ SYS_FUNC(futimesat) SYS_FUNC(utimensat) { print_dirfd(tcp, tcp->u_arg[0]); - decode_utimes(tcp, 1, 1); + printpath(tcp, tcp->u_arg[1]); + tprints(", "); + MPERS_PRINTER_NAME(print_timespec_utime_pair)(tcp, tcp->u_arg[2]); tprints(", "); printflags(at_flags, tcp->u_arg[3], "AT_???"); @@ -49,7 +36,7 @@ SYS_FUNC(osf_utimes) { printpath(tcp, tcp->u_arg[0]); tprints(", "); - printtv_bitness(tcp, tcp->u_arg[1], BITNESS_32, 0); + printtv_bitness(tcp, tcp->u_arg[1], BITNESS_32, 0); return RVAL_DECODED; }