diff options
author | Roland McGrath <roland@redhat.com> | 2004-10-06 22:27:43 +0000 |
---|---|---|
committer | Roland McGrath <roland@redhat.com> | 2004-10-06 22:27:43 +0000 |
commit | d83c50b8e44db2a2e19d048ab7d1e1caf1fa1996 (patch) | |
tree | 69b1a56800f790069ed3ca90245707e792696b7d /time.c | |
parent | d2553bbb8728f83bce358eaba0396255279da62c (diff) | |
download | strace-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.c | 93 |
1 files changed, 93 insertions, 0 deletions
@@ -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 */ |