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.
This commit is contained in:
Дмитрий Левин 2015-09-16 21:47:48 +00:00
parent b8f0c9286a
commit dd6bf4b6b4
3 changed files with 143 additions and 84 deletions

View File

@ -102,6 +102,7 @@ strace_SOURCES = \
print_msgbuf.c \
print_sigevent.c \
print_time.c \
print_timex.c \
printmode.c \
printrusage.c \
printsiginfo.c \

141
print_timex.c Normal file
View File

@ -0,0 +1,141 @@
/*
* Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
* Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
* Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
* Copyright (c) 2006-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.
*/
#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;
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;
}

85
time.c
View File

@ -30,7 +30,6 @@
#include "defs.h"
#include <fcntl.h>
#include <signal.h>
#include <linux/version.h>
#include <sys/timex.h>
#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)