--- /dev/null
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <time.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/syscall.h>
+
+#ifdef __NR_time
+
+int
+main(void)
+{
+ const size_t page_len = sysconf(_SC_PAGESIZE);
+
+ void *p = mmap(NULL, page_len * 2, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (p == MAP_FAILED || mprotect(p + page_len, page_len, PROT_NONE))
+ return 77;
+
+ time_t *p_t = p + page_len - sizeof(time_t);
+ time_t t = syscall(__NR_time, p_t);
+
+ if ((time_t) -1 == t || t != *p_t)
+ return 77;
+
+ printf("time\\(\\[%jd\\]\\) += %jd\n", (intmax_t) t, (intmax_t) t);
+
+ return 0;
+}
+
+#else
+
+int
+main(void)
+{
+ return 77;
+}
+
+#endif
--- /dev/null
+#!/bin/sh
+
+# Check time syscall decoding.
+
+. "${srcdir=.}/init.sh"
+
+run_prog > /dev/null
+OUT="$LOG.out"
+run_strace -etime $args > "$OUT"
+match_grep "$LOG" "$OUT"
+rm -f "$OUT"
+
+exit 0
# else
# define current_time_t_is_compat (current_wordsize == 4)
# endif
+# define current_time_t_is_int32 current_time_t_is_compat
#else
# define current_time_t_is_compat 0
+# define current_time_t_is_int32 (sizeof(time_t) == 4)
#endif
struct timeval32
SYS_FUNC(time)
{
if (exiting(tcp)) {
- printnum_long(tcp, tcp->u_arg[0], "%ld");
+ if (current_time_t_is_int32)
+ printnum_int(tcp, tcp->u_arg[0], "%d");
+ else
+ printnum_int64(tcp, tcp->u_arg[0], "%" PRId64);
}
return 0;
}