Module Name: src
Committed By: kre
Date: Tue Sep 17 15:25:39 UTC 2024
Modified Files:
src/bin/date: date.1 date.c
Log Message:
date(1) says:
STANDARDS
The date utility is expected to be compatible with IEEE Std 1003.2
(“POSIX.2”).
yet the format used for the date string arg is:
[[[[[[CC]yy]mm]dd]HH]MM[.SS]]
whereas POSIX demands
mmddHHMM[[CC]yy]
Why anyone would ever want to use that archaic form is incomprehensible
to me, yet, that is what is required.
Implement support for the POSIX format if POSIXLY_CORRECT is set in
the environment (in the full date(1) build only) in a rather crude
way that relies upon the user getting the format correct.
Tools builds are unaffected - setting the time is not supported there.
(It could be made to work, half setting the time, using -j, is possible
in tools builds, but pointless, and this cheap implementation uses
strptime() which is not necessarily available to a tools build.)
Mention this (very briefly) in the man page.
To generate a diff of this commit:
cvs rdiff -u -r1.56 -r1.57 src/bin/date/date.1
cvs rdiff -u -r1.69 -r1.70 src/bin/date/date.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/bin/date/date.1
diff -u src/bin/date/date.1:1.56 src/bin/date/date.1:1.57
--- src/bin/date/date.1:1.56 Tue Sep 17 14:56:48 2024
+++ src/bin/date/date.1 Tue Sep 17 15:25:39 2024
@@ -1,4 +1,4 @@
-.\" $NetBSD: date.1,v 1.56 2024/09/17 14:56:48 kre Exp $
+.\" $NetBSD: date.1,v 1.57 2024/09/17 15:25:39 kre Exp $
.\"
.\" Copyright (c) 1980, 1990, 1993
.\" The Regents of the University of California. All rights reserved.
@@ -310,6 +310,15 @@ option can be omitted to parse the time
or the second could be replaced by
.Fl U
to show the parsed time in the local timezone.
+.Pp
+Either of the commands:
+.Pp
+.Dl date -u -d 1970-01-01T00:00:00 -U +%c
+.Dl date -r 0 +%c
+.Pp
+print the local time of the
+.Ux
+epoch.
.Sh DIAGNOSTICS
Exit status is 0 on success, 1 if unable to set the date, and 2
if able to set the local date, but unable to set it globally.
@@ -350,6 +359,13 @@ The
.Nm
utility is expected to be compatible with
.St -p1003.2 .
+However, achieving true compatability requires running
+.Nm
+with the environment variable
+.Ev POSIXLY_CORRECT
+set, in order to parse the time string in the
+archaic format POSIX demands, rather than the
+more rational version described above.
.Sh HISTORY
A
.Nm
Index: src/bin/date/date.c
diff -u src/bin/date/date.c:1.69 src/bin/date/date.c:1.70
--- src/bin/date/date.c:1.69 Tue Sep 17 14:56:48 2024
+++ src/bin/date/date.c Tue Sep 17 15:25:39 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: date.c,v 1.69 2024/09/17 14:56:48 kre Exp $ */
+/* $NetBSD: date.c,v 1.70 2024/09/17 15:25:39 kre Exp $ */
/*
* Copyright (c) 1985, 1987, 1988, 1993
@@ -44,7 +44,7 @@ __COPYRIGHT(
#if 0
static char sccsid[] = "@(#)date.c 8.2 (Berkeley) 4/28/95";
#else
-__RCSID("$NetBSD: date.c,v 1.69 2024/09/17 14:56:48 kre Exp $");
+__RCSID("$NetBSD: date.c,v 1.70 2024/09/17 15:25:39 kre Exp $");
#endif
#endif /* not lint */
@@ -373,6 +373,23 @@ setthetime(const char *p)
strlen(t), t);
goto setit;
}
+ if (getenv("POSIXLY_CORRECT") != NULL) {
+ int yrdigs;
+ const char * const e = "Bad POSIX format date ``%s''";
+
+ t = strptime(p, "%m%d%H%M", lt);
+ if (t == NULL)
+ errx(EXIT_FAILURE, e, p);
+ if (*t != '\0') {
+ yrdigs = strspn(t, "0123456789");
+ if (yrdigs != 2 && yrdigs != 4)
+ errx(EXIT_FAILURE, e, p);
+ t = strptime(t, yrdigs == 2 ? "%y" : "%Y", lt);
+ if (t == NULL || *t != '\0')
+ errx(EXIT_FAILURE, e, p);
+ }
+ goto setit;
+ }
#endif
for (t = p, dot = NULL; *t; ++t) {
if (*t == '.') {