From: Dmitry V. Levin Date: Sun, 11 Mar 2012 21:25:51 +0000 (+0000) Subject: Implement clock_adjtime syscall decoder X-Git-Tag: v4.7~124 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=73215473cea2bc53a520b5285775be84501b1f2d;p=strace Implement clock_adjtime syscall decoder * linux/dummy.h (sys_clock_adjtime): Remove. * linux/syscall.h (sys_clock_adjtime): New prototype. * time.c (do_adjtimex): New function, based on sys_adjtimex. (sys_adjtimex): Use it. (sys_clock_adjtime): New function. --- diff --git a/linux/dummy.h b/linux/dummy.h index cb21c1c5..9219ff08 100644 --- a/linux/dummy.h +++ b/linux/dummy.h @@ -30,7 +30,6 @@ /* still unfinished */ #define sys_add_key printargs -#define sys_clock_adjtime printargs #define sys_fanotify_init printargs #define sys_fanotify_mark printargs #define sys_get_robust_list printargs diff --git a/linux/syscall.h b/linux/syscall.h index 5e61c11d..7a66c840 100644 --- a/linux/syscall.h +++ b/linux/syscall.h @@ -44,6 +44,7 @@ int sys_capset(); int sys_chdir(); int sys_chmod(); int sys_chown(); +int sys_clock_adjtime(); int sys_clock_gettime(); int sys_clock_nanosleep(); int sys_clock_settime(); diff --git a/time.c b/time.c index 066cf404..5662455d 100644 --- a/time.c +++ b/time.c @@ -582,22 +582,28 @@ tprint_timex(struct tcb *tcp, long addr) return 0; } +static int +do_adjtimex(struct tcb *tcp, long addr) +{ + if (addr == 0) + tprints("NULL"); + else if (syserror(tcp) || !verbose(tcp)) + tprintf("%#lx", addr); + else if (tprint_timex(tcp, addr) < 0) + tprints("{...}"); + if (syserror(tcp)) + return 0; + tcp->auxstr = xlookup(adjtimex_state, tcp->u_rval); + if (tcp->auxstr) + return RVAL_STR; + return 0; +} + int sys_adjtimex(struct tcb *tcp) { - if (exiting(tcp)) { - if (tcp->u_arg[0] == 0) - tprints("NULL"); - else if (syserror(tcp) || !verbose(tcp)) - tprintf("%#lx", tcp->u_arg[0]); - else if (tprint_timex(tcp, tcp->u_arg[0]) < 0) - tprints("{...}"); - if (syserror(tcp)) - return 0; - tcp->auxstr = xlookup(adjtimex_state, tcp->u_rval); - if (tcp->auxstr) - return RVAL_STR; - } + if (exiting(tcp)) + return do_adjtimex(tcp, tcp->u_arg[0]); return 0; } @@ -676,6 +682,16 @@ sys_clock_nanosleep(struct tcb *tcp) return 0; } +int +sys_clock_adjtime(struct tcb *tcp) +{ + if (exiting(tcp)) + return do_adjtimex(tcp, tcp->u_arg[1]); + printxval(clocknames, tcp->u_arg[0], "CLOCK_???"); + tprints(", "); + return 0; +} + #ifndef SIGEV_THREAD_ID # define SIGEV_THREAD_ID 4 #endif