]> granicus.if.org Git - strace/commitdiff
Convert parser of struct timex to new mpers infrastructure
authorDmitry V. Levin <ldv@altlinux.org>
Wed, 16 Sep 2015 21:58:36 +0000 (21:58 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Thu, 17 Sep 2015 13:25:53 +0000 (13:25 +0000)
* 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.

defs.h
print_timex.c
tests/.gitignore
tests/Makefile.am
tests/adjtimex.c [new file with mode: 0644]
tests/adjtimex.test [new file with mode: 0755]
time.c

diff --git a/defs.h b/defs.h
index 9e5528cf8eef9bf2e0ef1b8e0bb0493b36633657..7fd619d8099a0c981c4d5588af1d96d925e60995 100644 (file)
--- 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[];
index a7b496408292bff3d765f05e88aafda29d65ad43..10d89403169b3b7dd7e0ba445c084fc6815f4afd 100644 (file)
  */
 
 #include "defs.h"
-#include <sys/timex.h>
-
-#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 <sys/timex.h>
+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",
index d0f0633ec1e6aed8587bcfd6dc945f09c12d9a53..0fa6f9c1d22a9334b5aeef61442c9ba6dc0e2449 100644 (file)
@@ -1,3 +1,4 @@
+adjtimex
 aio
 bpf
 caps
index 7a219d326e435e330472599b847fc5243758b3fe..48ae05e46b7ebc83831e4ec825942371f9b5e74a 100644 (file)
@@ -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 (file)
index 0000000..3b130b2
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
+ * 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 <stdio.h>
+#include <stdint.h>
+#include <sys/timex.h>
+
+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 (executable)
index 0000000..10653aa
--- /dev/null
@@ -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 d45f641ea2daf8809e80149275b56939a3062305..48b7e19bc4b90912e35381290692f158d9064b92 100644 (file)
--- 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)