summaryrefslogtreecommitdiff
path: root/time.c
diff options
context:
space:
mode:
authorRoland McGrath <roland@redhat.com>2004-10-06 22:27:43 +0000
committerRoland McGrath <roland@redhat.com>2004-10-06 22:27:43 +0000
commitd83c50b8e44db2a2e19d048ab7d1e1caf1fa1996 (patch)
tree69b1a56800f790069ed3ca90245707e792696b7d /time.c
parentd2553bbb8728f83bce358eaba0396255279da62c (diff)
downloadstrace-d83c50b8e44db2a2e19d048ab7d1e1caf1fa1996.tar.gz
strace-d83c50b8e44db2a2e19d048ab7d1e1caf1fa1996.tar.bz2
strace-d83c50b8e44db2a2e19d048ab7d1e1caf1fa1996.tar.xz
2004-09-13 Ulrich Drepper <drepper@redhat.com>, Dmitry V. Levin <ldv@altlinux.org>
* time.c [LINUX] (print_rtc): New function, for printing rtc_time structure. [LINUX] (rtc_ioctl): New function, for parsing RTC_* ioctls. * ioctl.c [LINUX] (ioctl_decode): Call rtc_ioctl. * defs.h [LINUX]: Declare rtc_ioctl. Fixes RH#58606.
Diffstat (limited to 'time.c')
-rw-r--r--time.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/time.c b/time.c
index d273f0c..5176f53 100644
--- a/time.c
+++ b/time.c
@@ -34,6 +34,8 @@
#ifdef LINUX
#include <linux/version.h>
#include <sys/timex.h>
+#include <linux/ioctl.h>
+#include <linux/rtc.h>
#endif /* LINUX */
void
@@ -519,4 +521,95 @@ struct tcb *tcp;
}
return 0;
}
+
+static void
+print_rtc(tcp, rt)
+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, ",
+ rt->tm_sec, rt->tm_min, rt->tm_hour,
+ rt->tm_mday, rt->tm_mon, rt->tm_year);
+ if (!abbrev(tcp))
+ tprintf("tm_wday=%d, tm_yday=%d, tm_isdst=%d}",
+ rt->tm_wday, rt->tm_yday, rt->tm_isdst);
+ else
+ tprintf("...}");
+}
+
+int
+rtc_ioctl(tcp, code, arg)
+struct tcb *tcp;
+long code;
+long 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 {
+ tprintf(", ");
+ 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 {
+ tprintf(", ");
+ print_rtc(tcp, &rt);
+ }
+ }
+ break;
+ case RTC_IRQP_SET:
+ case RTC_EPOCH_SET:
+ if (entering(tcp))
+ tprintf(", %lu", arg);
+ break;
+ case RTC_IRQP_READ:
+ case RTC_EPOCH_READ:
+ if (exiting(tcp))
+ tprintf(", %lu", arg);
+ break;
+ 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);
+ tprintf("}");
+ }
+ }
+ 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);
+ tprintf("}");
+ }
+ }
+ break;
+ default:
+ if (entering(tcp))
+ tprintf(", %#lx", arg);
+ break;
+ }
+ return 1;
+}
#endif /* LINUX */