summaryrefslogtreecommitdiffstats
path: root/bin/ls
diff options
context:
space:
mode:
authorguenther <guenther@openbsd.org>2014-01-09 03:07:52 +0000
committerguenther <guenther@openbsd.org>2014-01-09 03:07:52 +0000
commit64a7b209fc4d06948ab03d4ddeef044ecef22014 (patch)
treeec617c833a7a0fcf0eec6fc6cdec3d00234bdca6 /bin/ls
parentFix the tests for the pf divert state and socket reuse. (diff)
downloadwireguard-openbsd-64a7b209fc4d06948ab03d4ddeef044ecef22014.tar.xz
wireguard-openbsd-64a7b209fc4d06948ab03d4ddeef044ecef22014.zip
Per POSIX, times in the future should be reported with the year
like files more than six months old. Use strftime() directly instead of breaking down the ctime() output on character positions. ok millert@
Diffstat (limited to 'bin/ls')
-rw-r--r--bin/ls/print.c45
1 files changed, 20 insertions, 25 deletions
diff --git a/bin/ls/print.c b/bin/ls/print.c
index 57a0c111a22..2889f515085 100644
--- a/bin/ls/print.c
+++ b/bin/ls/print.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: print.c,v 1.30 2013/05/30 16:34:32 guenther Exp $ */
+/* $OpenBSD: print.c,v 1.31 2014/01/09 03:07:52 guenther Exp $ */
/* $NetBSD: print.c,v 1.15 1996/12/11 03:25:39 thorpej Exp $ */
/*
@@ -61,6 +61,9 @@ static int compute_columns(DISPLAY *, int *);
#define IS_NOPRINT(p) ((p)->fts_number == NO_PRINT)
+#define DATELEN 64
+#define SIXMONTHS ((DAYSPERNYEAR / 2) * SECSPERDAY)
+
void
printscol(DISPLAY *dp)
{
@@ -235,32 +238,24 @@ printaname(FTSENT *p, u_long inodefield, u_long sizefield)
static void
printtime(time_t ftime)
{
- int i;
- char *longstring;
- static time_t six_months_ago;
- static int sma_set = 0;
+ char f_date[DATELEN];
+ static time_t now;
+ static int now_set = 0;
-#define SIXMONTHS ((DAYSPERNYEAR / 2) * SECSPERDAY)
- if (! sma_set) {
- six_months_ago = time(NULL) - SIXMONTHS;
- sma_set = 1;
- }
- longstring = ctime(&ftime);
- for (i = 4; i < 11; ++i)
- (void)putchar(longstring[i]);
-
- if (f_sectime)
- for (i = 11; i < 24; i++)
- (void)putchar(longstring[i]);
- else if (ftime > six_months_ago)
- for (i = 11; i < 16; ++i)
- (void)putchar(longstring[i]);
- else {
- (void)putchar(' ');
- for (i = 20; i < 24; ++i)
- (void)putchar(longstring[i]);
+ if (! now_set) {
+ now = time(NULL);
+ now_set = 1;
}
- (void)putchar(' ');
+
+ /*
+ * convert time to string, and print
+ */
+ if (strftime(f_date, sizeof(f_date), f_sectime ? "%b %e %H:%M:%S %Y" :
+ (ftime <= now - SIXMONTHS || ftime > now) ? "%b %e %Y" :
+ "%b %e %H:%M", localtime(&ftime)) == 0)
+ f_date[0] = '\0';
+
+ printf("%s ", f_date);
}
void