]> granicus.if.org Git - strace/blob - rtc.c
tests: workaround systemd-nspawn habit of disabling unimplemented syscalls
[strace] / rtc.c
1 /*
2  * Copyright (c) 2004 Ulrich Drepper <drepper@redhat.com>
3  * Copyright (c) 2004-2016 Dmitry V. Levin <ldv@altlinux.org>
4  * Copyright (c) 2015-2018 The strace developers.
5  * All rights reserved.
6  *
7  * SPDX-License-Identifier: LGPL-2.1-or-later
8  */
9
10 #include "defs.h"
11
12 #include DEF_MPERS_TYPE(struct_rtc_pll_info)
13
14 #include <linux/ioctl.h>
15 #include <linux/rtc.h>
16
17 typedef struct rtc_pll_info struct_rtc_pll_info;
18
19 #include MPERS_DEFS
20
21 static void
22 print_rtc_time(struct tcb *tcp, const struct rtc_time *rt)
23 {
24         tprintf("{tm_sec=%d, tm_min=%d, tm_hour=%d, "
25                 "tm_mday=%d, tm_mon=%d, tm_year=%d, ",
26                 rt->tm_sec, rt->tm_min, rt->tm_hour,
27                 rt->tm_mday, rt->tm_mon, rt->tm_year);
28         if (!abbrev(tcp))
29                 tprintf("tm_wday=%d, tm_yday=%d, tm_isdst=%d}",
30                         rt->tm_wday, rt->tm_yday, rt->tm_isdst);
31         else
32                 tprints("...}");
33 }
34
35 static void
36 decode_rtc_time(struct tcb *const tcp, const kernel_ulong_t addr)
37 {
38         struct rtc_time rt;
39
40         if (!umove_or_printaddr(tcp, addr, &rt))
41                 print_rtc_time(tcp, &rt);
42 }
43
44 static void
45 decode_rtc_wkalrm(struct tcb *const tcp, const kernel_ulong_t addr)
46 {
47         struct rtc_wkalrm wk;
48
49         if (!umove_or_printaddr(tcp, addr, &wk)) {
50                 tprintf("{enabled=%d, pending=%d, time=", wk.enabled, wk.pending);
51                 print_rtc_time(tcp, &wk.time);
52                 tprints("}");
53         }
54 }
55
56 static void
57 decode_rtc_pll_info(struct tcb *const tcp, const kernel_ulong_t addr)
58 {
59         struct_rtc_pll_info pll;
60
61         if (!umove_or_printaddr(tcp, addr, &pll))
62                 tprintf("{pll_ctrl=%d, pll_value=%d, pll_max=%d, pll_min=%d"
63                         ", pll_posmult=%d, pll_negmult=%d, pll_clock=%ld}",
64                         pll.pll_ctrl, pll.pll_value, pll.pll_max, pll.pll_min,
65                         pll.pll_posmult, pll.pll_negmult, (long) pll.pll_clock);
66 }
67
68 MPERS_PRINTER_DECL(int, rtc_ioctl, struct tcb *const tcp,
69                    const unsigned int code, const kernel_ulong_t arg)
70 {
71         switch (code) {
72         case RTC_ALM_READ:
73         case RTC_RD_TIME:
74                 if (entering(tcp))
75                         return 0;
76                 ATTRIBUTE_FALLTHROUGH;
77         case RTC_ALM_SET:
78         case RTC_SET_TIME:
79                 tprints(", ");
80                 decode_rtc_time(tcp, arg);
81                 break;
82         case RTC_IRQP_SET:
83         case RTC_EPOCH_SET:
84                 tprintf(", %" PRI_klu, arg);
85                 break;
86         case RTC_IRQP_READ:
87         case RTC_EPOCH_READ:
88                 if (entering(tcp))
89                         return 0;
90                 tprints(", ");
91                 printnum_ulong(tcp, arg);
92                 break;
93         case RTC_WKALM_RD:
94                 if (entering(tcp))
95                         return 0;
96                 ATTRIBUTE_FALLTHROUGH;
97         case RTC_WKALM_SET:
98                 tprints(", ");
99                 decode_rtc_wkalrm(tcp, arg);
100                 break;
101         case RTC_PLL_GET:
102                 if (entering(tcp))
103                         return 0;
104                 ATTRIBUTE_FALLTHROUGH;
105         case RTC_PLL_SET:
106                 tprints(", ");
107                 decode_rtc_pll_info(tcp, arg);
108                 break;
109 #ifdef RTC_VL_READ
110         case RTC_VL_READ:
111                 if (entering(tcp))
112                         return 0;
113                 tprints(", ");
114                 printnum_int(tcp, arg, "%d");
115                 break;
116 #endif
117         case RTC_AIE_ON:
118         case RTC_AIE_OFF:
119         case RTC_UIE_ON:
120         case RTC_UIE_OFF:
121         case RTC_PIE_ON:
122         case RTC_PIE_OFF:
123         case RTC_WIE_ON:
124         case RTC_WIE_OFF:
125 #ifdef RTC_VL_CLR
126         case RTC_VL_CLR:
127 #endif
128                 /* no args */
129                 break;
130         default:
131                 return RVAL_DECODED;
132         }
133
134         return RVAL_IOCTL_DECODED;
135 }