extern void printnum_int(struct tcb *, long, const char *);
extern void printpath(struct tcb *, long);
extern void printpathn(struct tcb *, long, int);
+#define TIMESPEC_TEXT_BUFSIZE (sizeof(long)*3 * 2 + sizeof("{%u, %u}"))
+#define TIMEVAL_TEXT_BUFSIZE TIMESPEC_TEXT_BUFSIZE
extern void printtv_bitness(struct tcb *, long, enum bitness_t, int);
-extern char *sprinttv(struct tcb *, long, enum bitness_t, char *);
+extern char *sprinttv(char *, struct tcb *, long, enum bitness_t, int special);
extern void print_timespec(struct tcb *, long);
extern void sprint_timespec(char *, struct tcb *, long);
#ifdef HAVE_SIGINFO_T
int
sys_recvmmsg(struct tcb *tcp)
{
- static char str[128];
- if (entering(tcp)) {
+ /* +5 chars are for "left " prefix */
+ static char str[5 + TIMESPEC_TEXT_BUFSIZE];
+ if (entering(tcp)) {
tprintf("%ld, ", tcp->u_arg[0]);
if (verbose(tcp)) {
sprint_timespec(str, tcp, tcp->u_arg[4]);
+ /* Abusing tcp->auxstr as temp storage.
+ * Will be used and freed on syscall exit.
+ */
tcp->auxstr = strdup(str);
} else {
tprintf("%#lx, %ld, ", tcp->u_arg[1], tcp->u_arg[2]);
if (!verbose(tcp))
return 0;
/* timeout on exit */
- strcpy(str, "left ");
- sprint_timespec(str + strlen(str), tcp, tcp->u_arg[4]);
+ sprint_timespec(stpcpy(str, "left "), tcp, tcp->u_arg[4]);
tcp->auxstr = str;
return RVAL_STR;
}
void
printtv_bitness(struct tcb *tcp, long addr, enum bitness_t bitness, int special)
{
- if (addr == 0)
- tprints("NULL");
- else if (!verbose(tcp))
- tprintf("%#lx", addr);
- else {
- int rc;
-
- if (bitness == BITNESS_32
-#if defined(LINUX) && SUPPORTED_PERSONALITIES > 1
- || personality_wordsize[current_personality] == 4
-#endif
- )
- {
- struct timeval32 tv;
-
- rc = umove(tcp, addr, &tv);
- if (rc >= 0) {
- if (special && tv.tv_sec == 0 &&
- tv.tv_usec == UTIME_NOW)
- tprints("UTIME_NOW");
- else if (special && tv.tv_sec == 0 &&
- tv.tv_usec == UTIME_OMIT)
- tprints("UTIME_OMIT");
- else
- tprint_timeval32(tcp, &tv);
- }
- } else {
- struct timeval tv;
-
- rc = umove(tcp, addr, &tv);
- if (rc >= 0) {
- if (special && tv.tv_sec == 0 &&
- tv.tv_usec == UTIME_NOW)
- tprints("UTIME_NOW");
- else if (special && tv.tv_sec == 0 &&
- tv.tv_usec == UTIME_OMIT)
- tprints("UTIME_OMIT");
- else
- tprint_timeval(tcp, &tv);
- }
- }
- if (rc < 0)
- tprints("{...}");
- }
+ char buf[TIMEVAL_TEXT_BUFSIZE];
+ sprinttv(buf, tcp, addr, bitness, special);
+ tprints(buf);
}
char *
-sprinttv(struct tcb *tcp, long addr, enum bitness_t bitness, char *buf)
+sprinttv(char *buf, struct tcb *tcp, long addr, enum bitness_t bitness, int special)
{
int rc;
struct timeval32 tv;
rc = umove(tcp, addr, &tv);
- if (rc >= 0)
+ if (rc >= 0) {
+ if (special && tv.tv_sec == 0) {
+ if (tv.tv_usec == UTIME_NOW)
+ return stpcpy(buf, "UTIME_NOW");
+ if (tv.tv_usec == UTIME_OMIT)
+ return stpcpy(buf, "UTIME_OMIT");
+ }
return buf + sprintf(buf, "{%u, %u}",
tv.tv_sec, tv.tv_usec);
+ }
} else {
struct timeval tv;
rc = umove(tcp, addr, &tv);
- if (rc >= 0)
+ if (rc >= 0) {
+ if (special && tv.tv_sec == 0) {
+ if (tv.tv_usec == UTIME_NOW)
+ return stpcpy(buf, "UTIME_NOW");
+ if (tv.tv_usec == UTIME_OMIT)
+ return stpcpy(buf, "UTIME_OMIT");
+ }
return buf + sprintf(buf, "{%lu, %lu}",
(unsigned long) tv.tv_sec,
(unsigned long) tv.tv_usec);
+ }
}
return stpcpy(buf, "{...}");
}
-void print_timespec(struct tcb *tcp, long addr)
+void
+print_timespec(struct tcb *tcp, long addr)
{
- if (addr == 0)
- tprints("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;
-
- rc = umove(tcp, addr, &tv);
- if (rc >= 0)
- tprintf("{%u, %u}",
- tv.tv_sec, tv.tv_usec);
- } else
-#endif
- {
- struct timespec ts;
-
- rc = umove(tcp, addr, &ts);
- if (rc >= 0)
- tprintf("{%lu, %lu}",
- (unsigned long) ts.tv_sec,
- (unsigned long) ts.tv_nsec);
- }
- if (rc < 0)
- tprints("{...}");
- }
+ char buf[TIMESPEC_TEXT_BUFSIZE];
+ sprint_timespec(buf, tcp, addr);
+ tprints(buf);
}
-void sprint_timespec(char *buf, struct tcb *tcp, long addr)
+void
+sprint_timespec(char *buf, struct tcb *tcp, long addr)
{
if (addr == 0)
strcpy(buf, "NULL");