]> granicus.if.org Git - strace/blob - print_time.c
Convert parser of struct timeval to new mpers infrastructure
[strace] / print_time.c
1 #include "defs.h"
2
3 #include DEF_MPERS_TYPE(time_t)
4 #include DEF_MPERS_TYPE(timespec_t)
5 #include DEF_MPERS_TYPE(timeval_t)
6
7 typedef struct timespec timespec_t;
8 typedef struct timeval timeval_t;
9
10 #include MPERS_DEFS
11
12 #ifndef UTIME_NOW
13 # define UTIME_NOW ((1l << 30) - 1l)
14 #endif
15 #ifndef UTIME_OMIT
16 # define UTIME_OMIT ((1l << 30) - 2l)
17 #endif
18
19 static const char time_fmt[] = "{%jd, %jd}";
20
21 static void
22 print_timespec_t(const timespec_t *t)
23 {
24         tprintf(time_fmt, (intmax_t) t->tv_sec, (intmax_t) t->tv_nsec);
25 }
26
27 static void
28 print_timespec_t_utime(const timespec_t *t)
29 {
30         switch (t->tv_nsec) {
31         case UTIME_NOW:
32                 tprints("UTIME_NOW");
33                 break;
34         case UTIME_OMIT:
35                 tprints("UTIME_OMIT");
36                 break;
37         default:
38                 print_timespec_t(t);
39                 break;
40         }
41 }
42
43 static void
44 print_timeval_t(const timeval_t *t)
45 {
46         tprintf(time_fmt, (intmax_t) t->tv_sec, (intmax_t) t->tv_usec);
47 }
48
49 MPERS_PRINTER_DECL(void, print_timespec)(struct tcb *tcp, const long addr)
50 {
51         timespec_t t;
52
53         if (umove_or_printaddr(tcp, addr, &t))
54                 return;
55
56         print_timespec_t(&t);
57 }
58
59 MPERS_PRINTER_DECL(void, print_timespec_utime_pair)(struct tcb *tcp, const long addr)
60 {
61         timespec_t t[2];
62
63         if (umove_or_printaddr(tcp, addr, &t))
64                 return;
65
66         tprints("[");
67         print_timespec_t_utime(&t[0]);
68         tprints(", ");
69         print_timespec_t_utime(&t[1]);
70         tprints("]");
71 }
72
73 MPERS_PRINTER_DECL(void, print_itimerspec)(struct tcb *tcp, const long addr)
74 {
75         timespec_t t[2];
76
77         if (umove_or_printaddr(tcp, addr, &t))
78                 return;
79
80         tprints("{it_interval=");
81         print_timespec_t(&t[0]);
82         tprints(", it_value=");
83         print_timespec_t(&t[1]);
84         tprints("}");
85 }
86
87 MPERS_PRINTER_DECL(void, print_timeval)(struct tcb *tcp, const long addr)
88 {
89         timeval_t t;
90
91         if (umove_or_printaddr(tcp, addr, &t))
92                 return;
93
94         print_timeval_t(&t);
95 }
96
97 MPERS_PRINTER_DECL(void, print_timeval_pair)(struct tcb *tcp, const long addr)
98 {
99         timeval_t t[2];
100
101         if (umove_or_printaddr(tcp, addr, &t))
102                 return;
103
104         tprints("[");
105         print_timeval_t(&t[0]);
106         tprints(", ");
107         print_timeval_t(&t[1]);
108         tprints("]");
109 }
110
111 MPERS_PRINTER_DECL(void, print_itimerval)(struct tcb *tcp, const long addr)
112 {
113         timeval_t t[2];
114
115         if (umove_or_printaddr(tcp, addr, &t))
116                 return;
117
118         tprints("{it_interval=");
119         print_timeval_t(&t[0]);
120         tprints(", it_value=");
121         print_timeval_t(&t[1]);
122         tprints("}");
123 }
124
125 SYS_FUNC(time)
126 {
127         if (exiting(tcp)) {
128                 time_t t;
129
130                 if (!umove_or_printaddr(tcp, tcp->u_arg[0], &t))
131                         tprintf("[%jd]", (intmax_t) t);
132         }
133
134         return 0;
135 }
136
137 #ifdef ALPHA
138
139 typedef struct {
140         int tv_sec, tv_usec;
141 } timeval32_t;
142
143 static void
144 print_timeval32_t(const timeval32_t *t)
145 {
146         tprintf(time_fmt, (intmax_t) t->tv_sec, (intmax_t) t->tv_usec);
147 }
148
149 void
150 print_timeval32(struct tcb *tcp, const long addr)
151 {
152         timeval32_t t;
153
154         if (umove_or_printaddr(tcp, addr, &t))
155                 return;
156
157         print_timeval32_t(&t);
158 }
159
160 void
161 print_timeval32_pair(struct tcb *tcp, const long addr)
162 {
163         timeval32_t t[2];
164
165         if (umove_or_printaddr(tcp, addr, &t))
166                 return;
167
168         tprints("[");
169         print_timeval32_t(&t[0]);
170         tprints(", ");
171         print_timeval32_t(&t[1]);
172         tprints("]");
173 }
174
175 void
176 print_itimerval32(struct tcb *tcp, const long addr)
177 {
178         timeval32_t t[2];
179
180         if (umove_or_printaddr(tcp, addr, &t))
181                 return;
182
183         tprints("{it_interval=");
184         print_timeval32_t(&t[0]);
185         tprints(", it_value=");
186         print_timeval32_t(&t[1]);
187         tprints("}");
188 }
189
190 #endif /* ALPHA */