>From fc34bbe3795b6094da98e05de1a59aa267f7afc6 Mon Sep 17 00:00:00 2001 From: Martin Bukatovic Date: Sat, 2 Mar 2019 19:57:17 -0800 Subject: [PATCH] stat: print birth time on systems supporting statx * configure.ac: Check for statx(), available on glibc >= 2.28. * src/stat.c (get_birthtime): Call statx() when available. * NEWS: Mention the improvement. --- NEWS | 3 +++ configure.ac | 3 +++ src/stat.c | 19 +++++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/NEWS b/NEWS index c190efe..d6c17e4 100644 --- a/NEWS +++ b/NEWS @@ -98,6 +98,9 @@ GNU coreutils NEWS -*- outline -*- stat and tail now know about the "sdcardfs" file system on Android. stat -f -c%T now reports the file system type, and tail -f uses inotify. + stat now prints file creation time when supported by the file system, + on GNU Linux systems with glibc >= 2.28 and kernel >= 4.11. + * Noteworthy changes in release 8.30 (2018-07-01) [stable] diff --git a/configure.ac b/configure.ac index 23086cd..0ee01b2 100644 --- a/configure.ac +++ b/configure.ac @@ -317,6 +317,9 @@ if test $ac_cv_func_getattrat = yes; then AC_SUBST([LIB_NVPAIR]) fi +# glibc >= 2.28 and linux kernel >= 4.11 +AC_CHECK_FUNCS([statx]) + # SCO-ODT-3.0 is reported to need -los to link programs using initgroups AC_CHECK_FUNCS([initgroups]) if test $ac_cv_func_initgroups = no; then diff --git a/src/stat.c b/src/stat.c index c8f1809..7c71c37 100644 --- a/src/stat.c +++ b/src/stat.c @@ -1009,6 +1009,25 @@ get_birthtime (int fd, char const *filename, struct stat const *st) } #endif +#if HAVE_STATX + if (ts.tv_nsec < 0) + { + struct statx stx; + if ((fd < 0 + ? statx(AT_FDCWD, filename, + follow_links ? 0 : AT_SYMLINK_NOFOLLOW, + STATX_BTIME, &stx) + : statx(fd, "", AT_EMPTY_PATH, STATX_BTIME, &stx)) == 0) + { + if ((stx.stx_mask & STATX_BTIME) && stx.stx_btime.tv_sec != 0) + { + ts.tv_sec = stx.stx_btime.tv_sec; + ts.tv_nsec = stx.stx_btime.tv_nsec; + } + } + } +#endif + return ts; } -- 2.9.3