From: Dmitry V. Levin Date: Wed, 16 Sep 2015 21:47:48 +0000 (+0000) Subject: Move parser of struct timex to a separate file X-Git-Tag: v4.11~196 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dd6bf4b6b47b8bf176e9af94195446bdec62889a;p=strace Move parser of struct timex to a separate file * print_timex.c: New file. * Makefile.am (strace_SOURCES): Add it. * time.c (tprint_timex32, tprint_timex): Move to print_timex.c. --- diff --git a/Makefile.am b/Makefile.am index 2870f5db..d40823f7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -102,6 +102,7 @@ strace_SOURCES = \ print_msgbuf.c \ print_sigevent.c \ print_time.c \ + print_timex.c \ printmode.c \ printrusage.c \ printsiginfo.c \ diff --git a/print_timex.c b/print_timex.c new file mode 100644 index 00000000..a7b49640 --- /dev/null +++ b/print_timex.c @@ -0,0 +1,141 @@ +/* + * Copyright (c) 1991, 1992 Paul Kranenburg + * Copyright (c) 1993 Branko Lankester + * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey + * Copyright (c) 2006-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. + */ + +#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; + + if (umove_or_printaddr(tcp, addr, &tx)) + return -1; + + 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 */ + +static void +tprint_timeval(struct tcb *tcp, const struct timeval *tv) +{ + tprintf("{%ju, %ju}", (uintmax_t) tv->tv_sec, (uintmax_t) tv->tv_usec); +} + +int +tprint_timex(struct tcb *tcp, long addr) +{ + 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; + + tprints("{modes="); + printflags(adjtimex_modes, tx.modes, "ADJ_???"); + tprintf(", offset=%jd, freq=%jd, maxerror=%ju, esterror=%ju, status=", + (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=", + (intmax_t) tx.constant, (uintmax_t) tx.precision, + (intmax_t) tx.tolerance); + tprint_timeval(tcp, &tx.time); + 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", + tx.shift, (intmax_t) tx.stabil, (intmax_t) tx.jitcnt); + tprintf(", calcnt=%jd, errcnt=%jd, stbcnt=%jd", + (intmax_t) tx.calcnt, (intmax_t) tx.errcnt, (intmax_t) tx.stbcnt); + tprints("}"); + return 0; +} diff --git a/time.c b/time.c index 91e09158..d45f641e 100644 --- a/time.c +++ b/time.c @@ -30,7 +30,6 @@ #include "defs.h" #include #include -#include #include #ifndef UTIME_NOW @@ -335,91 +334,9 @@ SYS_FUNC(osf_setitimer) } #endif -#include "xlat/adjtimex_modes.h" -#include "xlat/adjtimex_status.h" #include "xlat/adjtimex_state.h" -#if SUPPORTED_PERSONALITIES > 1 -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; - - if (umove_or_printaddr(tcp, addr, &tx)) - return -1; - - 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 */ - -static int -tprint_timex(struct tcb *tcp, long addr) -{ - 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; - - tprints("{modes="); - printflags(adjtimex_modes, tx.modes, "ADJ_???"); - tprintf(", offset=%jd, freq=%jd, maxerror=%ju, esterror=%ju, status=", - (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=", - (intmax_t) tx.constant, (uintmax_t) tx.precision, - (intmax_t) tx.tolerance); - tprint_timeval(tcp, &tx.time); - 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", - tx.shift, (intmax_t) tx.stabil, (intmax_t) tx.jitcnt); - tprintf(", calcnt=%jd, errcnt=%jd, stbcnt=%jd", - (intmax_t) tx.calcnt, (intmax_t) tx.errcnt, (intmax_t) tx.stbcnt); - tprints("}"); - return 0; -} +extern int tprint_timex(struct tcb *tcp, long addr); static int do_adjtimex(struct tcb *tcp, long addr)