* util.c (sprinttime): Add an nsec parameter for printing nanoseconds
immediately after seconds.
* defs.h (sprinttime): Likewise.
* statx.c (SYS_FUNC(statx)): Use it.
* print_struct_stat.c (print_struct_stat): Likewise.
* tests/print_time.c (print_time_t_nsec): Update to test printing of
times in the new format.
---
 defs.h              |  2 +-
 print_struct_stat.c |  4 +---
 statx.c             |  5 ++---
 tests/print_time.c  | 15 +++++++++++----
 util.c              | 26 +++++++++++++++++++-------
 utime.c             |  4 ++--
 6 files changed, 36 insertions(+), 20 deletions(-)

diff --git a/defs.h b/defs.h
index 5b81647c..223a47a8 100644
--- a/defs.h
+++ b/defs.h
@@ -547,7 +547,7 @@ extern int printargs_d(struct tcb *);
 extern void addflags(const struct xlat *, uint64_t);
 extern int printflags64(const struct xlat *, uint64_t, const char *);
 extern const char *sprintflags(const char *, const struct xlat *, uint64_t);
-extern const char *sprinttime(time_t);
+extern const char *sprinttime(time_t, unsigned long long);
 extern void print_symbolic_mode_t(unsigned int);
 extern void print_numeric_umode_t(unsigned short);
 extern void print_numeric_long_umask(unsigned long);
diff --git a/print_struct_stat.c b/print_struct_stat.c
index b5e0167e..487206ed 100644
--- a/print_struct_stat.c
+++ b/print_struct_stat.c
@@ -67,9 +67,7 @@ print_struct_stat(struct tcb *tcp, const struct strace_stat 
*const st)
        if (!abbrev(tcp)) {
 #define PRINT_ST_TIME(field)                           \
        tprints(", st_" #field "=");                    \
-       tprints(sprinttime(st->field));                 \
-       if (st->field ## _nsec)                         \
-               tprintf(".%09llu", st->field ## _nsec)
+       tprints(sprinttime(st->field, st->field ## _nsec));
 
                PRINT_ST_TIME(atime);
                PRINT_ST_TIME(mtime);
diff --git a/statx.c b/statx.c
index c53f29c2..e0c576ca 100644
--- a/statx.c
+++ b/statx.c
@@ -60,9 +60,8 @@ SYS_FUNC(statx)
 #define PRINT_FIELD_TIME(field)                                                
\
        do {                                                            \
                tprints(", " #field "=");                               \
-               tprints(sprinttime(stx.field.sec));                     \
-               if (stx.field.nsec)                                     \
-                       tprintf(".%09" PRId32, stx.field.nsec);         \
+               tprints(sprinttime(stx.field.sec,                       \
+                                  zero_extend_signed_to_ull(stx.field.nsec))); 
\
        } while (0)
 
                struct_statx stx;
diff --git a/tests/print_time.c b/tests/print_time.c
index 3d5b5545..76411dd7 100644
--- a/tests/print_time.c
+++ b/tests/print_time.c
@@ -42,13 +42,20 @@ print_time_t_nsec(const time_t t, const unsigned long long 
nsec)
                        perror_msg_and_fail("localtime");
                }
 
-               strftime(buf, sizeof(buf), "%FT%T%z", p);
+               strftime(buf, sizeof(buf), "%FT%T", p);
+               fputs(buf, stdout);
+
+               if (nsec) {
+                       printf(".%09llu", nsec);
+               }
+
+               strftime(buf, sizeof(buf), "%z", p);
                fputs(buf, stdout);
        } else {
                putchar('0');
-       }
 
-       if (nsec) {
-               printf(".%09llu", nsec);
+               if (nsec) {
+                       printf("%.09llu", nsec);
+               }
        }
 }
diff --git a/util.c b/util.c
index 31336a42..bf6439f0 100644
--- a/util.c
+++ b/util.c
@@ -545,18 +545,30 @@ printnum_addr_klong_int(struct tcb *tcp, const 
kernel_ulong_t addr)
 #endif /* !current_klongsize */
 
 const char *
-sprinttime(time_t t)
+sprinttime(time_t t, unsigned long long nsec)
 {
+       static char buf[sizeof(int) * 3 * 6 + sizeof(unsigned long long) * 3 +
+                       sizeof("+0000")];
        struct tm *tmp;
-       static char buf[sizeof(int) * 3 * 6 + sizeof("+0000")];
 
-       if (t == 0)
+       if (t == 0 && nsec == 0)
                return "0";
        tmp = localtime(&t);
-       if (tmp)
-               strftime(buf, sizeof(buf), "%FT%T%z", tmp);
-       else
-               snprintf(buf, sizeof(buf), "%lu", (unsigned long) t);
+       if (tmp) {
+               if (nsec) {
+                       static char tmp_buf[sizeof(buf)];
+                       strftime(tmp_buf, sizeof(tmp_buf), "%FT%T.%%09llu%z",
+                                tmp);
+                       snprintf(buf, sizeof(buf), tmp_buf, nsec);
+               } else
+                       strftime(buf, sizeof(buf), "%FT%T%z", tmp);
+       } else {
+               if (nsec)
+                       snprintf(buf, sizeof(buf), "%lu.%09llu",
+                                (unsigned long) t, nsec);
+               else
+                       snprintf(buf, sizeof(buf), "%lu", (unsigned long) t);
+       }
 
        return buf;
 }
diff --git a/utime.c b/utime.c
index 8126b350..1bff0faa 100644
--- a/utime.c
+++ b/utime.c
@@ -15,8 +15,8 @@ SYS_FUNC(utime)
        printpath(tcp, tcp->u_arg[0]);
        tprints(", ");
        if (!umove_or_printaddr(tcp, tcp->u_arg[1], &u)) {
-               tprintf("{actime=%s,", sprinttime(u.actime));
-               tprintf(" modtime=%s}", sprinttime(u.modtime));
+               tprintf("{actime=%s,", sprinttime(u.actime, 0));
+               tprintf(" modtime=%s}", sprinttime(u.modtime, 0));
        }
 
        return RVAL_DECODED;
-- 
2.12.2


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to