]> granicus.if.org Git - strace/blobdiff - rtc.c
Remove HAVE_STRUCT_TCB_EXT_ARG, ext_arg, and u_lrval
[strace] / rtc.c
diff --git a/rtc.c b/rtc.c
index f72f98ab84e3605f51e98aeb35c861ca5bef2ea7..43ea946651eb3e8bd2018c3a11dfa1361507fce1 100644 (file)
--- a/rtc.c
+++ b/rtc.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2004 Ulrich Drepper <drepper@redhat.com>
- * Copyright (c) 2004 Dmitry V. Levin <ldv@altlinux.org>
+ * Copyright (c) 2004-2016 Dmitry V. Levin <ldv@altlinux.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  */
 
 #include "defs.h"
+
+#include DEF_MPERS_TYPE(struct_rtc_pll_info)
+
 #include <linux/ioctl.h>
 #include <linux/rtc.h>
 
+typedef struct rtc_pll_info struct_rtc_pll_info;
+
+#include MPERS_DEFS
+
 static void
-print_rtc(struct tcb *tcp, const struct rtc_time *rt)
+print_rtc_time(struct tcb *tcp, const struct rtc_time *rt)
 {
        tprintf("{tm_sec=%d, tm_min=%d, tm_hour=%d, "
                "tm_mday=%d, tm_mon=%d, tm_year=%d, ",
@@ -44,72 +51,104 @@ print_rtc(struct tcb *tcp, const struct rtc_time *rt)
                tprints("...}");
 }
 
-int
-rtc_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
+static void
+decode_rtc_time(struct tcb *const tcp, const kernel_ulong_t addr)
+{
+       struct rtc_time rt;
+
+       if (!umove_or_printaddr(tcp, addr, &rt))
+               print_rtc_time(tcp, &rt);
+}
+
+static void
+decode_rtc_wkalrm(struct tcb *const tcp, const kernel_ulong_t addr)
+{
+       struct rtc_wkalrm wk;
+
+       if (!umove_or_printaddr(tcp, addr, &wk)) {
+               tprintf("{enabled=%d, pending=%d, time=", wk.enabled, wk.pending);
+               print_rtc_time(tcp, &wk.time);
+               tprints("}");
+       }
+}
+
+static void
+decode_rtc_pll_info(struct tcb *const tcp, const kernel_ulong_t addr)
+{
+       struct_rtc_pll_info pll;
+
+       if (!umove_or_printaddr(tcp, addr, &pll))
+               tprintf("{pll_ctrl=%d, pll_value=%d, pll_max=%d, pll_min=%d"
+                       ", pll_posmult=%d, pll_negmult=%d, pll_clock=%ld}",
+                       pll.pll_ctrl, pll.pll_value, pll.pll_max, pll.pll_min,
+                       pll.pll_posmult, pll.pll_negmult, (long) pll.pll_clock);
+}
+
+MPERS_PRINTER_DECL(int, rtc_ioctl, struct tcb *const tcp,
+                  const unsigned int code, const kernel_ulong_t arg)
 {
        switch (code) {
-       case RTC_ALM_SET:
-       case RTC_SET_TIME:
-               if (entering(tcp)) {
-                       struct rtc_time rt;
-                       if (umove(tcp, arg, &rt) < 0)
-                               tprintf(", %#lx", arg);
-                       else {
-                               tprints(", ");
-                               print_rtc(tcp, &rt);
-                       }
-               }
-               break;
        case RTC_ALM_READ:
        case RTC_RD_TIME:
-               if (exiting(tcp)) {
-                       struct rtc_time rt;
-                       if (syserror(tcp) || umove(tcp, arg, &rt) < 0)
-                               tprintf(", %#lx", arg);
-                       else {
-                               tprints(", ");
-                               print_rtc(tcp, &rt);
-                       }
-               }
+               if (entering(tcp))
+                       return 0;
+               /* fall through */
+       case RTC_ALM_SET:
+       case RTC_SET_TIME:
+               tprints(", ");
+               decode_rtc_time(tcp, arg);
                break;
        case RTC_IRQP_SET:
        case RTC_EPOCH_SET:
-               if (entering(tcp))
-                       tprintf(", %lu", arg);
+               tprintf(", %" PRI_klu, arg);
                break;
        case RTC_IRQP_READ:
        case RTC_EPOCH_READ:
-               if (exiting(tcp))
-                       tprintf(", %lu", arg);
+               if (entering(tcp))
+                       return 0;
+               tprints(", ");
+               printnum_ulong(tcp, arg);
                break;
+       case RTC_WKALM_RD:
+               if (entering(tcp))
+                       return 0;
+               /* fall through */
        case RTC_WKALM_SET:
-               if (entering(tcp)) {
-                       struct rtc_wkalrm wk;
-                       if (umove(tcp, arg, &wk) < 0)
-                               tprintf(", %#lx", arg);
-                       else {
-                               tprintf(", {enabled=%d, pending=%d, ",
-                                       wk.enabled, wk.pending);
-                               print_rtc(tcp, &wk.time);
-                               tprints("}");
-                       }
-               }
+               tprints(", ");
+               decode_rtc_wkalrm(tcp, arg);
                break;
-       case RTC_WKALM_RD:
-               if (exiting(tcp)) {
-                       struct rtc_wkalrm wk;
-                       if (syserror(tcp) || umove(tcp, arg, &wk) < 0)
-                               tprintf(", %#lx", arg);
-                       else {
-                               tprintf(", {enabled=%d, pending=%d, ",
-                                       wk.enabled, wk.pending);
-                               print_rtc(tcp, &wk.time);
-                               tprints("}");
-                       }
-               }
+       case RTC_PLL_GET:
+               if (entering(tcp))
+                       return 0;
+               /* fall through */
+       case RTC_PLL_SET:
+               tprints(", ");
+               decode_rtc_pll_info(tcp, arg);
+               break;
+#ifdef RTC_VL_READ
+       case RTC_VL_READ:
+               if (entering(tcp))
+                       return 0;
+               tprints(", ");
+               printnum_int(tcp, arg, "%d");
+               break;
+#endif
+       case RTC_AIE_ON:
+       case RTC_AIE_OFF:
+       case RTC_UIE_ON:
+       case RTC_UIE_OFF:
+       case RTC_PIE_ON:
+       case RTC_PIE_OFF:
+       case RTC_WIE_ON:
+       case RTC_WIE_OFF:
+#ifdef RTC_VL_CLR
+       case RTC_VL_CLR:
+#endif
+               /* no args */
                break;
        default:
-               return 0;
+               return RVAL_DECODED;
        }
-       return 1;
+
+       return RVAL_DECODED | 1;
 }