]> granicus.if.org Git - strace/blobdiff - rtc.c
v4l2: streamline logic
[strace] / rtc.c
diff --git a/rtc.c b/rtc.c
index 0806b0e43d2f6bef315ef42585190b6225992d8f..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_time(struct tcb *tcp, const struct rtc_time *rt)
 {
@@ -45,45 +52,55 @@ print_rtc_time(struct tcb *tcp, const struct rtc_time *rt)
 }
 
 static void
-decode_rtc_time(struct tcb *tcp, const long addr)
+decode_rtc_time(struct tcb *const tcp, const kernel_ulong_t addr)
 {
        struct rtc_time rt;
 
-       tprints(", ");
        if (!umove_or_printaddr(tcp, addr, &rt))
                print_rtc_time(tcp, &rt);
 }
 
 static void
-decode_rtc_wkalrm(struct tcb *tcp, const long addr)
+decode_rtc_wkalrm(struct tcb *const tcp, const kernel_ulong_t addr)
 {
        struct rtc_wkalrm wk;
 
-       tprints(", ");
        if (!umove_or_printaddr(tcp, addr, &wk)) {
-               tprintf("{enabled=%d, pending=%d, ", wk.enabled, wk.pending);
+               tprintf("{enabled=%d, pending=%d, time=", wk.enabled, wk.pending);
                print_rtc_time(tcp, &wk.time);
                tprints("}");
        }
 }
 
-int
-rtc_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
+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:
-               decode_rtc_time(tcp, arg);
-               break;
        case RTC_ALM_READ:
        case RTC_RD_TIME:
                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:
-               tprintf(", %lu", arg);
+               tprintf(", %" PRI_klu, arg);
                break;
        case RTC_IRQP_READ:
        case RTC_EPOCH_READ:
@@ -92,13 +109,21 @@ rtc_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
                tprints(", ");
                printnum_ulong(tcp, arg);
                break;
+       case RTC_WKALM_RD:
+               if (entering(tcp))
+                       return 0;
+               /* fall through */
        case RTC_WKALM_SET:
+               tprints(", ");
                decode_rtc_wkalrm(tcp, arg);
                break;
-       case RTC_WKALM_RD:
+       case RTC_PLL_GET:
                if (entering(tcp))
                        return 0;
-               decode_rtc_wkalrm(tcp, arg);
+               /* fall through */
+       case RTC_PLL_SET:
+               tprints(", ");
+               decode_rtc_pll_info(tcp, arg);
                break;
 #ifdef RTC_VL_READ
        case RTC_VL_READ:
@@ -108,6 +133,19 @@ rtc_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
                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 RVAL_DECODED;
        }