X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=time.c;h=6c542f631f9b74061bbc61f32d7b70846733e98b;hb=7708f597d9e8ff488ea364e1834b54cb266c43f9;hp=4dda0b30f062a9d2ade48b066fad2e902c6170ea;hpb=f1e3a320458be22ef7e308f44d0a7b80887da36b;p=strace diff --git a/time.c b/time.c index 4dda0b30..6c542f63 100644 --- a/time.c +++ b/time.c @@ -32,108 +32,16 @@ #include #include -#ifndef UTIME_NOW -#define UTIME_NOW ((1l << 30) - 1l) -#endif -#ifndef UTIME_OMIT -#define UTIME_OMIT ((1l << 30) - 2l) -#endif - -#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 -#else -# define current_time_t_is_compat 0 -#endif - -struct timeval32 -{ - u_int32_t tv_sec, tv_usec; -}; - -void -printtv_bitness(struct tcb *tcp, long addr, enum bitness_t bitness, int special) -{ - char buf[TIMEVAL_TEXT_BUFSIZE]; - sprinttv(buf, tcp, addr, bitness, special); - tprints(buf); -} - -static char * -do_sprinttv(char *buf, const uintmax_t sec, const uintmax_t usec, - const int special) -{ - if (special) { - switch (usec) { - case UTIME_NOW: - return stpcpy(buf, "UTIME_NOW"); - case UTIME_OMIT: - return stpcpy(buf, "UTIME_OMIT"); - } - } - return buf + sprintf(buf, "{%ju, %ju}", sec, usec); -} - -char * -sprinttv(char *buf, struct tcb *tcp, long addr, enum bitness_t bitness, int special) +static void +print_timezone(struct tcb *const tcp, const kernel_ulong_t addr) { - if (addr == 0) - return stpcpy(buf, "NULL"); - - if (!verbose(tcp) || (exiting(tcp) && syserror(tcp))) - return buf + sprintf(buf, "%#lx", addr); + struct timezone tz; - if (bitness == BITNESS_32 || current_time_t_is_compat) - { - struct timeval32 tv; + if (umove_or_printaddr(tcp, addr, &tz)) + return; - if (umove(tcp, addr, &tv) >= 0) - return do_sprinttv(buf, tv.tv_sec, tv.tv_usec, special); - } else { - struct timeval tv; - - if (umove(tcp, addr, &tv) >= 0) - return do_sprinttv(buf, tv.tv_sec, tv.tv_usec, special); - } - - return buf + sprintf(buf, "%#lx", addr); -} - -void -sprint_timespec(char *buf, struct tcb *tcp, long addr) -{ - if (addr == 0) - strcpy(buf, "NULL"); - else if (!verbose(tcp)) - sprintf(buf, "%#lx", addr); - else { - int rc; - -#if SUPPORTED_PERSONALITIES > 1 - if (current_time_t_is_compat) { - struct timeval32 tv; - - rc = umove(tcp, addr, &tv); - if (rc >= 0) - sprintf(buf, "{%u, %u}", - tv.tv_sec, tv.tv_usec); - } else -#endif - { - struct timespec ts; - - rc = umove(tcp, addr, &ts); - if (rc >= 0) - sprintf(buf, "{%ju, %ju}", - (uintmax_t) ts.tv_sec, - (uintmax_t) ts.tv_nsec); - } - if (rc < 0) - strcpy(buf, "{...}"); - } + tprintf("{tz_minuteswest=%d, tz_dsttime=%d}", + tz.tz_minuteswest, tz.tz_dsttime); } SYS_FUNC(gettimeofday) @@ -141,7 +49,7 @@ SYS_FUNC(gettimeofday) if (exiting(tcp)) { print_timeval(tcp, tcp->u_arg[0]); tprints(", "); - print_timeval(tcp, tcp->u_arg[1]); + print_timezone(tcp, tcp->u_arg[1]); } return 0; } @@ -152,7 +60,7 @@ SYS_FUNC(osf_gettimeofday) if (exiting(tcp)) { print_timeval32(tcp, tcp->u_arg[0]); tprints(", "); - print_timeval32(tcp, tcp->u_arg[1]); + print_timezone(tcp, tcp->u_arg[1]); } return 0; } @@ -162,7 +70,7 @@ SYS_FUNC(settimeofday) { print_timeval(tcp, tcp->u_arg[0]); tprints(", "); - print_timeval(tcp, tcp->u_arg[1]); + print_timezone(tcp, tcp->u_arg[1]); return RVAL_DECODED; } @@ -172,7 +80,7 @@ SYS_FUNC(osf_settimeofday) { print_timeval32(tcp, tcp->u_arg[0]); tprints(", "); - print_timeval32(tcp, tcp->u_arg[1]); + print_timezone(tcp, tcp->u_arg[1]); return RVAL_DECODED; } @@ -259,11 +167,11 @@ SYS_FUNC(osf_setitimer) #include "xlat/adjtimex_state.h" static int -do_adjtimex(struct tcb *tcp, long addr) +do_adjtimex(struct tcb *const tcp, const kernel_ulong_t addr) { if (print_timex(tcp, addr)) return 0; - tcp->auxstr = xlookup(adjtimex_state, tcp->u_rval); + tcp->auxstr = xlookup(adjtimex_state, (kernel_ulong_t) tcp->u_rval); if (tcp->auxstr) return RVAL_STR; return 0; @@ -395,18 +303,6 @@ SYS_FUNC(timer_gettime) #include "xlat/timerfdflags.h" -SYS_FUNC(timerfd) -{ - tprintf("%ld, ", tcp->u_arg[0]); - printclockname(tcp->u_arg[0]); - tprints(", "); - printflags(timerfdflags, tcp->u_arg[2], "TFD_???"); - tprints(", "); - print_itimerspec(tcp, tcp->u_arg[3]); - - return RVAL_DECODED | RVAL_FD; -} - SYS_FUNC(timerfd_create) { printclockname(tcp->u_arg[0]); @@ -418,15 +314,17 @@ SYS_FUNC(timerfd_create) SYS_FUNC(timerfd_settime) { - printfd(tcp, tcp->u_arg[0]); - tprints(", "); - printflags(timerfdflags, tcp->u_arg[1], "TFD_???"); - tprints(", "); - print_itimerspec(tcp, tcp->u_arg[2]); - tprints(", "); - print_itimerspec(tcp, tcp->u_arg[3]); - - return RVAL_DECODED; + if (entering(tcp)) { + printfd(tcp, tcp->u_arg[0]); + tprints(", "); + printflags(timerfdflags, tcp->u_arg[1], "TFD_???"); + tprints(", "); + print_itimerspec(tcp, tcp->u_arg[2]); + tprints(", "); + } else { + print_itimerspec(tcp, tcp->u_arg[3]); + } + return 0; } SYS_FUNC(timerfd_gettime)