* time.c (print_timespec, sprint_timespec): New functions.
* defs.h (print_timespec, sprint_timespec): Declare them.
* desc.c (sys_io_getevents): Use print_timespec.
* stream.c (sys_ppoll): Likewise.
(decode_poll): Use sprint_timespec.
extern void printpathn P((struct tcb *, long, int));
extern void printtv_bitness P((struct tcb *, long, enum bitness_t, int));
extern void sprinttv P((struct tcb *, long, enum bitness_t, char *));
+extern void print_timespec P((struct tcb *, long));
+extern void sprint_timespec P((char *, struct tcb *, long));
#ifdef HAVE_SIGINFO_T
extern void printsiginfo P((siginfo_t *, int));
#endif
}
int
-sys_io_getevents(tcp)
-struct tcb *tcp;
+sys_io_getevents(struct tcb * tcp)
{
if (entering(tcp)) {
tprintf("%ld, %ld, %ld, ", tcp->u_arg[0], tcp->u_arg[1],
#endif
}
- if (tcp->u_arg[4] == 0)
- tprintf("NULL");
- else {
- struct timespec to;
- if (umove(tcp, tcp->u_arg[4], &to) == 0)
- tprintf("{%lu, %lu}", to.tv_sec, to.tv_nsec);
- else
- tprintf("{...}");
- }
+ print_timespec(tcp, tcp->u_arg[4]);
}
return 0;
}
strcat(outstr, "]");
if (pts) {
- struct timespec ts;
char str[128];
sprintf(str, "%sleft ", cumlen ? ", " : "");
- if (umove(tcp, pts, &ts) == 0)
- sprintf(str + strlen(str), "{%lu, %lu}",
- ts.tv_sec, ts.tv_nsec);
- else
- strcat(str, "{...}");
+ sprint_timespec(str + strlen(str), tcp, pts);
if ((cumlen += strlen(str)) < sizeof(outstr))
strcat(outstr, str);
}
{
int rc = decode_poll(tcp, tcp->u_arg[2]);
if (entering(tcp)) {
- struct timespec ts;
- if (umove(tcp, tcp->u_arg[2], &ts) == 0)
- tprintf("{%lu, %lu}, ", ts.tv_sec, ts.tv_nsec);
- else
- tprintf("{...}, ");
+ print_timespec(tcp, tcp->u_arg[2]);
+ tprintf(", ");
print_sigset(tcp, tcp->u_arg[3], 0);
tprintf(", %lu", tcp->u_arg[4]);
}
}
}
+void print_timespec (struct tcb *tcp, long addr)
+{
+ if (addr == 0)
+ tprintf("NULL");
+ else if (!verbose(tcp))
+ tprintf("%#lx", addr);
+ else {
+ int rc;
+
+#if defined(LINUX) && SUPPORTED_PERSONALITIES > 1
+ if (personality_wordsize[current_personality] == 4)
+ {
+ struct timeval32 tv;
+
+ if ((rc = umove(tcp, addr, &tv)) >= 0)
+ tprintf("{%u, %u}",
+ tv.tv_sec, tv.tv_usec);
+ } else
+ {
+#endif
+ struct timespec ts;
+
+ if ((rc = umove(tcp, addr, &ts)) >= 0)
+ tprintf("{%lu, %lu}",
+ (unsigned long) ts.tv_sec,
+ (unsigned long) ts.tv_nsec);
+#if defined(LINUX) && SUPPORTED_PERSONALITIES > 1
+ }
+#endif
+
+ if (rc < 0)
+ tprintf("{...}");
+ }
+}
+
+void sprint_timespec (char *buf, struct tcb *tcp, long addr)
+{
+ if (addr == 0)
+ strcpy(buf, "NULL");
+ else if (!verbose(tcp))
+ sprintf(buf, "%#lx", addr);
+ else {
+ int rc;
+
+#if defined(LINUX) && SUPPORTED_PERSONALITIES > 1
+ if (personality_wordsize[current_personality] == 4)
+ {
+ struct timeval32 tv;
+
+ if ((rc = umove(tcp, addr, &tv)) >= 0)
+ sprintf(buf, "{%u, %u}",
+ tv.tv_sec, tv.tv_usec);
+ } else
+ {
+#endif
+ struct timespec ts;
+
+ if ((rc = umove(tcp, addr, &ts)) >= 0)
+ sprintf(buf, "{%lu, %lu}",
+ (unsigned long) ts.tv_sec,
+ (unsigned long) ts.tv_nsec);
+#if defined(LINUX) && SUPPORTED_PERSONALITIES > 1
+ }
+#endif
+
+ if (rc < 0)
+ strcpy(buf, "{...}");
+ }
+}
+
int
sys_time(tcp)
struct tcb *tcp;