From: Dmitry V. Levin Date: Wed, 16 Sep 2015 21:58:36 +0000 (+0000) Subject: Convert parser of struct timex to new mpers infrastructure X-Git-Tag: v4.11~195 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dad1eef568375be367868a2e3c4783251dbb7627;p=strace Convert parser of struct timex to new mpers infrastructure * defs.h (adjtimex_modes, adjtimex_status): New xlat prototypes. * print_timex.c (struct_timex): New typedef. Mpersify it. [IN_MPERS]: Do not include "xlat/adjtimex_modes.h" and "xlat/adjtimex_status.h". [SUPPORTED_PERSONALITIES > 1]: Remove. (tprint_timeval): Remove. (tprint_timex): Rename to print_timex. Mpersify it. * time.c (do_adjtimex): Rename tprint_timex to print_timex. * tests/adjtimex.c: New file. * tests/adjtimex.test: New test. * tests/Makefile.am (check_PROGRAMS): Add adjtimex. (TESTS): Add adjtimex.test. * tests/.gitignore: Add adjtimex. --- diff --git a/defs.h b/defs.h index 9e5528cf..7fd619d8 100644 --- a/defs.h +++ b/defs.h @@ -410,6 +410,8 @@ struct xlat { #define XLAT_END { 0, NULL } extern const struct xlat addrfams[]; +extern const struct xlat adjtimex_modes[]; +extern const struct xlat adjtimex_status[]; extern const struct xlat at_flags[]; extern const struct xlat open_access_modes[]; extern const struct xlat open_mode_flags[]; diff --git a/print_timex.c b/print_timex.c index a7b49640..10d89403 100644 --- a/print_timex.c +++ b/print_timex.c @@ -29,94 +29,23 @@ */ #include "defs.h" -#include - -#include "xlat/adjtimex_modes.h" -#include "xlat/adjtimex_status.h" - -#if SUPPORTED_PERSONALITIES > 1 - -# if defined X86_64 || defined X32 -# define current_time_t_is_compat (current_personality == 1) -# else -# define current_time_t_is_compat (current_wordsize == 4) -# endif - -struct timeval32 -{ - u_int32_t tv_sec, tv_usec; -}; -static void -tprint_timeval32(struct tcb *tcp, const struct timeval32 *tv) -{ - tprintf("{%u, %u}", tv->tv_sec, tv->tv_usec); -} - -static int -tprint_timex32(struct tcb *tcp, long addr) -{ - struct { - unsigned int modes; - int offset; - int freq; - int maxerror; - int esterror; - int status; - int constant; - int precision; - int tolerance; - struct timeval32 time; - int tick; - int ppsfreq; - int jitter; - int shift; - int stabil; - int jitcnt; - int calcnt; - int errcnt; - int stbcnt; - } tx; +#include DEF_MPERS_TYPE(struct_timex) - if (umove_or_printaddr(tcp, addr, &tx)) - return -1; +#include +typedef struct timex struct_timex; - tprints("{modes="); - printflags(adjtimex_modes, tx.modes, "ADJ_???"); - tprintf(", offset=%d, freq=%d, maxerror=%d, ", - tx.offset, tx.freq, tx.maxerror); - tprintf("esterror=%u, status=", tx.esterror); - printflags(adjtimex_status, tx.status, "STA_???"); - tprintf(", constant=%d, precision=%u, ", - tx.constant, tx.precision); - tprintf("tolerance=%d, time=", tx.tolerance); - tprint_timeval32(tcp, &tx.time); - tprintf(", tick=%d, ppsfreq=%d, jitter=%d", - tx.tick, tx.ppsfreq, tx.jitter); - tprintf(", shift=%d, stabil=%d, jitcnt=%d", - tx.shift, tx.stabil, tx.jitcnt); - tprintf(", calcnt=%d, errcnt=%d, stbcnt=%d", - tx.calcnt, tx.errcnt, tx.stbcnt); - tprints("}"); - return 0; -} -#endif /* SUPPORTED_PERSONALITIES > 1 */ +#include MPERS_DEFS -static void -tprint_timeval(struct tcb *tcp, const struct timeval *tv) -{ - tprintf("{%ju, %ju}", (uintmax_t) tv->tv_sec, (uintmax_t) tv->tv_usec); -} +#ifndef IN_MPERS +# include "xlat/adjtimex_modes.h" +# include "xlat/adjtimex_status.h" +#endif -int -tprint_timex(struct tcb *tcp, long addr) +MPERS_PRINTER_DECL(int, print_timex)(struct tcb *tcp, const long addr) { - struct timex tx; + struct_timex tx; -#if SUPPORTED_PERSONALITIES > 1 - if (current_time_t_is_compat) - return tprint_timex32(tcp, addr); -#endif if (umove_or_printaddr(tcp, addr, &tx)) return -1; @@ -126,10 +55,11 @@ tprint_timex(struct tcb *tcp, long addr) (intmax_t) tx.offset, (intmax_t) tx.freq, (uintmax_t) tx.maxerror, (uintmax_t) tx.esterror); printflags(adjtimex_status, tx.status, "STA_???"); - tprintf(", constant=%jd, precision=%ju, tolerance=%jd, time=", + tprintf(", constant=%jd, precision=%ju, tolerance=%jd", (intmax_t) tx.constant, (uintmax_t) tx.precision, (intmax_t) tx.tolerance); - tprint_timeval(tcp, &tx.time); + tprintf(", time={%jd, %jd}", + (intmax_t) tx.time.tv_sec, (intmax_t) tx.time.tv_usec); tprintf(", tick=%jd, ppsfreq=%jd, jitter=%jd", (intmax_t) tx.tick, (intmax_t) tx.ppsfreq, (intmax_t) tx.jitter); tprintf(", shift=%d, stabil=%jd, jitcnt=%jd", diff --git a/tests/.gitignore b/tests/.gitignore index d0f0633e..0fa6f9c1 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -1,3 +1,4 @@ +adjtimex aio bpf caps diff --git a/tests/Makefile.am b/tests/Makefile.am index 7a219d32..48ae05e4 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -11,6 +11,7 @@ AM_CPPFLAGS = -I$(top_builddir)/$(OS)/$(ARCH) \ -I$(top_srcdir) check_PROGRAMS = \ + adjtimex \ aio \ bpf \ caps \ @@ -93,6 +94,7 @@ TESTS = \ strace-f.test \ qual_syscall.test \ bexecve.test \ + adjtimex.test \ aio.test \ bpf.test \ caps.test \ diff --git a/tests/adjtimex.c b/tests/adjtimex.c new file mode 100644 index 00000000..3b130b2b --- /dev/null +++ b/tests/adjtimex.c @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2015 Dmitry V. Levin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +int +main(void) +{ + struct timex tx = {}; + int state = adjtimex(&tx); + + if (state < 0) + return 77; + + printf("adjtimex\\(\\{modes=0, offset=%jd, freq=%jd, maxerror=%jd" + ", esterror=%jd, status=%s, constant=%jd, precision=%jd" + ", tolerance=%jd, time={%jd, %jd}, tick=%jd, ppsfreq=%jd" + ", jitter=%jd, shift=%d, stabil=%jd, jitcnt=%jd, calcnt=%jd" + ", errcnt=%jd, stbcnt=%jd\\}\\) = %d \\(TIME_[A-Z]+\\)\n", + (intmax_t) tx.offset, + (intmax_t) tx.freq, + (intmax_t) tx.maxerror, + (intmax_t) tx.esterror, + tx.status ? "STA_[A-Z]+(\\|STA_[A-Z]+)*" : "0", + (intmax_t) tx.constant, + (intmax_t) tx.precision, + (intmax_t) tx.tolerance, + (intmax_t) tx.time.tv_sec, + (intmax_t) tx.time.tv_usec, + (intmax_t) tx.tick, + (intmax_t) tx.ppsfreq, + (intmax_t) tx.jitter, + tx.shift, + (intmax_t) tx.stabil, + (intmax_t) tx.jitcnt, + (intmax_t) tx.calcnt, + (intmax_t) tx.errcnt, + (intmax_t) tx.stbcnt, + state); + + return 0; +} diff --git a/tests/adjtimex.test b/tests/adjtimex.test new file mode 100755 index 00000000..10653aa0 --- /dev/null +++ b/tests/adjtimex.test @@ -0,0 +1,13 @@ +#!/bin/sh + +# Check adjtimex syscall decoding. + +. "${srcdir=.}/init.sh" + +run_prog > /dev/null +OUT="$LOG.out" +run_strace -e adjtimex $args > "$OUT" +match_grep "$LOG" "$OUT" +rm -f "$OUT" + +exit 0 diff --git a/time.c b/time.c index d45f641e..48b7e19b 100644 --- a/time.c +++ b/time.c @@ -336,12 +336,10 @@ SYS_FUNC(osf_setitimer) #include "xlat/adjtimex_state.h" -extern int tprint_timex(struct tcb *tcp, long addr); - static int do_adjtimex(struct tcb *tcp, long addr) { - if (tprint_timex(tcp, addr)) + if (print_timex(tcp, addr)) return 0; tcp->auxstr = xlookup(adjtimex_state, tcp->u_rval); if (tcp->auxstr)