[PATCH 3/3] Rework struct timespec decoders
Dmitry V. Levin
ldv at altlinux.org
Sat Sep 22 23:45:35 UTC 2007
2007-09-22 Dmitry V. Levin <ldv at altlinux.org>
* defs.h (print_timespec, sprint_timespec): New functions.
* desc.c (sys_io_getevents): Use print_timespec.
* stream.c (decode_poll): Use sprint_timespec.
(sys_ppoll): Use print_timespec.
* time.c (print_timespec, sprint_timespec): New functions.
--- a/strace/defs.h
+++ b/strace/defs.h
@@ -457,6 +457,8 @@ extern void printpath P((struct tcb *, long));
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
--- a/strace/desc.c
+++ b/strace/desc.c
@@ -816,8 +816,7 @@ struct tcb *tcp;
}
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],
@@ -851,15 +850,7 @@ struct tcb *tcp;
#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;
}
--- a/strace/stream.c
+++ b/strace/stream.c
@@ -417,15 +417,10 @@ decode_poll(struct tcb *tcp, long pts)
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);
}
@@ -459,11 +454,8 @@ sys_ppoll(struct tcb *tcp)
{
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]);
}
--- a/strace/time.c
+++ b/strace/time.c
@@ -150,6 +150,76 @@ sprinttv(struct tcb *tcp, long addr, enum bitness_t bitness, char *buf)
}
}
+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;
--
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20070923/998c17a4/attachment.bin>
More information about the Strace-devel
mailing list