addresses https://savannah.gnu.org/bugs/index.php?66299
the ls program itself has both a parameter and a recognized environment
variable, TIME_STYLE, that formats the output of the file's timestamp in the
listing. To achieve partial parity for the -ls output of find, the code is
refactored to honor the environment variable (a style parameter is not
implemented herein).
diff --git a/lib/listfile.c b/lib/listfile.c
index e6ee70e3..78f89991 100644
--- a/lib/listfile.c
+++ b/lib/listfile.c
@@ -341,17 +341,27 @@ list_file (const char *name,
/* Use strftime rather than ctime, because the former can produce
locale-dependent names for the month (%b).
+ As ls does, honor the TIME_STYLE environment variable, if present;
+ otherwise:
Output the year if the file is fairly old or in the future.
POSIX says the cutoff is 6 months old;
approximate this by 6*30 days.
Allow a 1 hour slop factor for what is considered "the future",
to allow for NFS server/client clock disagreement. */
- char const *fmt =
- ((current_time - 6 * 30 * 24 * 60 * 60 <= statp->st_mtime
- && statp->st_mtime <= current_time + 60 * 60)
- ? "%b %e %H:%M"
- : "%b %e %Y");
-
+ char *ts = getenv("TIME_STYLE");
+ char const *fmt;
+ if(ts) {
+ /* ls expects TIME_STYLE to start with a '+'; if it were re-used
+ here, the '+' should be ignored when passing into strftime,
+ below. */
+ if(*ts == '+') ts++;
+ fmt = ts;
+ } else {
+ fmt = ((current_time - 6 * 30 * 24 * 60 * 60 <= statp->st_mtime
+ && statp->st_mtime <= current_time + 60 * 60)
+ ? "%b %e %H:%M"
+ : "%b %e %Y");
+ }
while (!strftime (buf, bufsize, fmt, when_local))
buf = alloca (bufsize *= 2);
--
2.51.0