blob: 500ce8e5b1683eb52ef5ba3c18f8793688e629ae [file] [log] [blame]
Dmitry V. Levin38a34c92015-12-17 17:56:48 +00001/*
2 * Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
Dmitry V. Levinb5a23ed2015-08-04 01:52:40 +030028#include "defs.h"
29
Dmitry V. Levinba40d852015-09-17 16:10:53 +000030#include DEF_MPERS_TYPE(time_t)
Dmitry V. Levinb5a23ed2015-08-04 01:52:40 +030031#include DEF_MPERS_TYPE(timespec_t)
32#include DEF_MPERS_TYPE(timeval_t)
33
34typedef struct timespec timespec_t;
35typedef struct timeval timeval_t;
36
37#include MPERS_DEFS
38
39#ifndef UTIME_NOW
40# define UTIME_NOW ((1l << 30) - 1l)
41#endif
42#ifndef UTIME_OMIT
43# define UTIME_OMIT ((1l << 30) - 2l)
44#endif
45
Dmitry V. Levin207ba112015-09-17 16:47:03 +000046static const char time_fmt[] = "{%jd, %jd}";
47
48static void
49print_timespec_t(const timespec_t *t)
50{
51 tprintf(time_fmt, (intmax_t) t->tv_sec, (intmax_t) t->tv_nsec);
52}
53
Dmitry V. Levinb5a23ed2015-08-04 01:52:40 +030054static void
Dmitry V. Levin5eb23622015-09-17 15:12:42 +000055print_timespec_t_utime(const timespec_t *t)
Dmitry V. Levinb5a23ed2015-08-04 01:52:40 +030056{
57 switch (t->tv_nsec) {
58 case UTIME_NOW:
59 tprints("UTIME_NOW");
60 break;
61 case UTIME_OMIT:
62 tprints("UTIME_OMIT");
63 break;
64 default:
Dmitry V. Levin207ba112015-09-17 16:47:03 +000065 print_timespec_t(t);
Dmitry V. Levinb5a23ed2015-08-04 01:52:40 +030066 break;
67 }
68}
69
70static void
Dmitry V. Levin5eb23622015-09-17 15:12:42 +000071print_timeval_t(const timeval_t *t)
Dmitry V. Levinb5a23ed2015-08-04 01:52:40 +030072{
Dmitry V. Levin207ba112015-09-17 16:47:03 +000073 tprintf(time_fmt, (intmax_t) t->tv_sec, (intmax_t) t->tv_usec);
Dmitry V. Levinb5a23ed2015-08-04 01:52:40 +030074}
75
Dmitry V. Levina8fce092016-05-21 22:53:06 +000076MPERS_PRINTER_DECL(void, print_timespec,
77 struct tcb *tcp, const long addr)
Dmitry V. Levin59385262015-09-18 15:16:11 +000078{
79 timespec_t t;
80
81 if (umove_or_printaddr(tcp, addr, &t))
82 return;
83
84 print_timespec_t(&t);
85}
86
Dmitry V. Levina8fce092016-05-21 22:53:06 +000087MPERS_PRINTER_DECL(const char *, sprint_timespec,
88 struct tcb *tcp, const long addr)
Dmitry V. Levin2950de32015-09-18 17:44:16 +000089{
90 timespec_t t;
91 static char buf[sizeof(time_fmt) + 3 * sizeof(t)];
92
93 if (!addr) {
94 strcpy(buf, "NULL");
95 } else if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) ||
96 umove(tcp, addr, &t)) {
97 snprintf(buf, sizeof(buf), "%#lx", addr);
98 } else {
99 snprintf(buf, sizeof(buf), time_fmt,
100 (intmax_t) t.tv_sec, (intmax_t) t.tv_nsec);
101 }
102
103 return buf;
104}
105
Dmitry V. Levina8fce092016-05-21 22:53:06 +0000106MPERS_PRINTER_DECL(void, print_timespec_utime_pair,
107 struct tcb *tcp, const long addr)
Dmitry V. Levinb5a23ed2015-08-04 01:52:40 +0300108{
109 timespec_t t[2];
110
111 if (umove_or_printaddr(tcp, addr, &t))
112 return;
113
114 tprints("[");
Dmitry V. Levin5eb23622015-09-17 15:12:42 +0000115 print_timespec_t_utime(&t[0]);
Dmitry V. Levinb5a23ed2015-08-04 01:52:40 +0300116 tprints(", ");
Dmitry V. Levin5eb23622015-09-17 15:12:42 +0000117 print_timespec_t_utime(&t[1]);
Dmitry V. Levinb5a23ed2015-08-04 01:52:40 +0300118 tprints("]");
119}
120
Dmitry V. Levina8fce092016-05-21 22:53:06 +0000121MPERS_PRINTER_DECL(void, print_itimerspec,
122 struct tcb *tcp, const long addr)
Dmitry V. Levin22060852015-09-17 16:47:03 +0000123{
124 timespec_t t[2];
125
126 if (umove_or_printaddr(tcp, addr, &t))
127 return;
128
129 tprints("{it_interval=");
130 print_timespec_t(&t[0]);
131 tprints(", it_value=");
132 print_timespec_t(&t[1]);
133 tprints("}");
134}
135
Dmitry V. Levina8fce092016-05-21 22:53:06 +0000136MPERS_PRINTER_DECL(void, print_timeval,
137 struct tcb *tcp, const long addr)
Dmitry V. Levinf1e3a322015-09-18 15:16:11 +0000138{
139 timeval_t t;
140
141 if (umove_or_printaddr(tcp, addr, &t))
142 return;
143
144 print_timeval_t(&t);
145}
146
Dmitry V. Levina8fce092016-05-21 22:53:06 +0000147MPERS_PRINTER_DECL(void, print_timeval_pair,
148 struct tcb *tcp, const long addr)
Dmitry V. Levinb5a23ed2015-08-04 01:52:40 +0300149{
150 timeval_t t[2];
151
152 if (umove_or_printaddr(tcp, addr, &t))
153 return;
154
155 tprints("[");
Dmitry V. Levin5eb23622015-09-17 15:12:42 +0000156 print_timeval_t(&t[0]);
Dmitry V. Levinb5a23ed2015-08-04 01:52:40 +0300157 tprints(", ");
Dmitry V. Levin5eb23622015-09-17 15:12:42 +0000158 print_timeval_t(&t[1]);
Dmitry V. Levinb5a23ed2015-08-04 01:52:40 +0300159 tprints("]");
160}
Dmitry V. Levinba40d852015-09-17 16:10:53 +0000161
Dmitry V. Levina8fce092016-05-21 22:53:06 +0000162MPERS_PRINTER_DECL(const char *, sprint_timeval,
163 struct tcb *tcp, const long addr)
Dmitry V. Levin4cb5ccc2015-09-18 18:02:50 +0000164{
165 timeval_t t;
166 static char buf[sizeof(time_fmt) + 3 * sizeof(t)];
167
168 if (!addr) {
169 strcpy(buf, "NULL");
170 } else if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) ||
171 umove(tcp, addr, &t)) {
172 snprintf(buf, sizeof(buf), "%#lx", addr);
173 } else {
174 snprintf(buf, sizeof(buf), time_fmt,
175 (intmax_t) t.tv_sec, (intmax_t) t.tv_usec);
176 }
177
178 return buf;
179}
180
Dmitry V. Levina8fce092016-05-21 22:53:06 +0000181MPERS_PRINTER_DECL(void, print_itimerval,
182 struct tcb *tcp, const long addr)
Dmitry V. Levin322be802015-09-17 20:23:31 +0000183{
184 timeval_t t[2];
185
186 if (umove_or_printaddr(tcp, addr, &t))
187 return;
188
189 tprints("{it_interval=");
190 print_timeval_t(&t[0]);
191 tprints(", it_value=");
192 print_timeval_t(&t[1]);
193 tprints("}");
194}
195
Dmitry V. Levinba40d852015-09-17 16:10:53 +0000196SYS_FUNC(time)
197{
198 if (exiting(tcp)) {
199 time_t t;
200
201 if (!umove_or_printaddr(tcp, tcp->u_arg[0], &t))
202 tprintf("[%jd]", (intmax_t) t);
203 }
204
205 return 0;
206}
Dmitry V. Levin322be802015-09-17 20:23:31 +0000207
208#ifdef ALPHA
209
210typedef struct {
211 int tv_sec, tv_usec;
212} timeval32_t;
213
214static void
215print_timeval32_t(const timeval32_t *t)
216{
217 tprintf(time_fmt, (intmax_t) t->tv_sec, (intmax_t) t->tv_usec);
218}
219
220void
Dmitry V. Levinf1e3a322015-09-18 15:16:11 +0000221print_timeval32(struct tcb *tcp, const long addr)
222{
223 timeval32_t t;
224
225 if (umove_or_printaddr(tcp, addr, &t))
226 return;
227
228 print_timeval32_t(&t);
229}
230
231void
232print_timeval32_pair(struct tcb *tcp, const long addr)
233{
234 timeval32_t t[2];
235
236 if (umove_or_printaddr(tcp, addr, &t))
237 return;
238
239 tprints("[");
240 print_timeval32_t(&t[0]);
241 tprints(", ");
242 print_timeval32_t(&t[1]);
243 tprints("]");
244}
245
246void
Dmitry V. Levin322be802015-09-17 20:23:31 +0000247print_itimerval32(struct tcb *tcp, const long addr)
248{
249 timeval32_t t[2];
250
251 if (umove_or_printaddr(tcp, addr, &t))
252 return;
253
254 tprints("{it_interval=");
255 print_timeval32_t(&t[0]);
256 tprints(", it_value=");
257 print_timeval32_t(&t[1]);
258 tprints("}");
259}
260
Dmitry V. Levin4cb5ccc2015-09-18 18:02:50 +0000261const char *
262sprint_timeval32(struct tcb *tcp, const long addr)
263{
264 timeval32_t t;
265 static char buf[sizeof(time_fmt) + 3 * sizeof(t)];
266
267 if (!addr) {
268 strcpy(buf, "NULL");
269 } else if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) ||
270 umove(tcp, addr, &t)) {
271 snprintf(buf, sizeof(buf), "%#lx", addr);
272 } else {
273 snprintf(buf, sizeof(buf), time_fmt,
274 (intmax_t) t.tv_sec, (intmax_t) t.tv_usec);
275 }
276
277 return buf;
278}
279
Dmitry V. Levin322be802015-09-17 20:23:31 +0000280#endif /* ALPHA */