]> granicus.if.org Git - strace/commitdiff
Implement clock_adjtime syscall decoder
authorDmitry V. Levin <ldv@altlinux.org>
Sun, 11 Mar 2012 21:25:51 +0000 (21:25 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Sun, 11 Mar 2012 21:25:51 +0000 (21:25 +0000)
* 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.

linux/dummy.h
linux/syscall.h
time.c

index cb21c1c5e7bda9d1544977b81c477bd92738d3ea..9219ff08e90cb5b1cb1f3a714c95d8706aa4e521 100644 (file)
@@ -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
index 5e61c11d6d0d6d70dffd3e7816784841bea5dda8..7a66c840bd2e49f1f3ce79863f41631f9d394b64 100644 (file)
@@ -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 066cf4049b1dbf439cdac8c20a01cc744bc44dec..5662455d99dd64fb2e547360af7f9f988481acc3 100644 (file)
--- 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