Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 6 Oct 1999 02:01:00 +0200 (CEST)
From:      Christian Weisgerber <naddy@mips.rhein-neckar.de>
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/14151: Patch: date(1): merge in OpenBSD enhancements
Message-ID:  <199910060001.CAA08594@bigeye.rhein-neckar.de>

next in thread | raw e-mail | index | archive | help

>Number:         14151
>Category:       bin
>Synopsis:       Patch: date(1): merge in OpenBSD enhancements
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Tue Oct  5 18:40:00 PDT 1999
>Closed-Date:
>Last-Modified:
>Originator:     Christian Weisgerber
>Release:        FreeBSD 4.0-CURRENT i386
>Organization:
>Environment:

>Description:

The appended patch merges in the OpenBSD enhancements to the date(1)
utility. This includes the extension of the default date format with
an optional century, and a set of spelling/style/formatting fixes
to the man page.

>How-To-Repeat:

n/a

>Fix:

diff -ur date.orig/date.1 date/date.1
--- date.orig/date.1	Sat Aug 28 01:13:58 1999
+++ date/date.1	Wed Oct  6 00:33:40 1999
@@ -35,7 +35,7 @@
 .\"     @(#)date.1	8.3 (Berkeley) 4/28/95
 .\" $FreeBSD: src/bin/date/date.1,v 1.31 1999/08/27 23:13:58 peter Exp $
 .\"
-.Dd November 17, 1993
+.Dd April 28, 1995
 .Dt DATE 1
 .Os
 .Sh NAME
@@ -49,26 +49,29 @@
 .Op Fl t Ar minutes_west
 .Op Fl v Ns Ar [+|-]val Ns Op ymwdHMS
 .Ar ...
-.Op Fl f Ar fmt Ar date | [[[[yy]mm]dd]HH]MM[\&.ss]
+.Op Fl f Ar fmt Ar date | [[[[[cc]yy]mm]dd]HH]MM[\&.ss]
 .Op Cm + Ns Ar format
 .Sh DESCRIPTION
-.Nm Date
-displays the current date and time when invoked without arguments.
-Providing arguments will format the date and time in a user-defined
-way or set the date.
-Only the superuser may set the date.
+When invoked without arguments, the
+.Nm
+utility displays the current date and time.
+Otherwise, depending on the options specified,
+.Nm
+will set the date and time or print it in a user-defined way.
+.Pp
+Only the super-user may set the date.
 .Pp
 The options are as follows:
 .Bl -tag -width Ds
-.It Fl d
-Set the kernel's value for daylight savings time.
+.It Fl d Ar dst
+Set the kernel's value for daylight saving time.
 If
 .Ar dst
 is non-zero, future calls
 to
 .Xr gettimeofday 2
 will return a non-zero
-.Ql tz_dsttime  .
+.Ql tz_dsttime .
 .It Fl f
 Use
 .Ar fmt
@@ -88,7 +91,7 @@
 .Xr timed 8
 is used to synchronize the clocks on groups of machines.
 By default, if
-.Xr timed
+.Xr timed 8
 is running,
 .Nm
 will set the time on all of the machines in the local group.
@@ -97,23 +100,23 @@
 option stops
 .Nm
 from setting the time for other than the current machine.
-.It Fl r
-Print out the date and time in
+.It Fl r Ar seconds
+Print out (in specified format) the date and time represented by
 .Ar seconds
 from the Epoch.
-.It Fl t
+.It Fl t Ar minutes_west
 Set the kernel's value for minutes west of
 .Tn GMT .
-.Ar Minutes_west
+.Ar minutes_west
 specifies the number of minutes returned in
-.Ql tz_minuteswest  
+.Ql tz_minuteswest
 by future calls to
 .Xr gettimeofday 2 .
 .It Fl u
 Display or set the date in
-.Tn UCT
+.Tn UTC
 (universal) time.
-.It Fl v
+.It Fl v Ns Ar [+|-]val Ns Op ymwdHMS
 Adjust the second, minute, hour, month day, week day, month or year according to
 .Ar val .  
 If
@@ -150,10 +153,12 @@
 Refer to the examples below for further details.
 .El
 .Pp
-An operand with a leading plus (``+'') sign signals a user-defined format
+An operand with a leading plus sign
+.Pq Sq +
+signals a user-defined format
 string which specifies the format in which to display the date and time.
 The format string may contain any of the conversion specifications described
-in the 
+in the
 .Xr strftime 3
 manual page, as well as any arbitrary text.
 A <newline> character is always output after the characters specified by
@@ -169,24 +174,26 @@
 .Pp
 .Bl -tag -width Ds -compact -offset indent
 .It Ar yy
-Year in abbreviated form (e.g. 89 for 1989, 06 for 2006).
+Year in abbreviated form (for years falling within 1969\(em2068).
+The format
+.Ar ccyymmddHHMM
+is also permitted, for non-ambiguous years.
 .It Ar mm
-Numeric month.
-A number from 1 to 12.
+Numeric month, a number from 1 to 12.
 .It Ar dd
 Day, a number from 1 to 31.
 .It Ar HH
 Hour, a number from 0 to 23.
 .It Ar MM
-Minutes, a number from 0 to 59.
-.It Ar .ss
-Seconds, a number from 0 to 61 (59 plus a maximum of two leap seconds).
+Minute, a number from 0 to 59.
+.It Ar .SS
+Second, a number from 0 to 61 (59 plus a maximum of two leap seconds).
 .El
 .Pp
-Everything but the minutes is optional.
+Everything but the minute is optional.
 .Pp
-Time changes for Daylight Saving and Standard time and leap seconds
-and years are handled automatically.
+Time changes for daylight saving time, standard time, leap seconds,
+and leap years are handled automatically.
 .Sh EXAMPLES
 The command:
 .Bd -literal -offset indent
@@ -250,9 +257,8 @@
 .Li "2:32 PM" ,
 without modifying the date.
 .Sh ENVIRONMENT
-The execution of
-.Nm
-is affected by the following environment variables:
+The following environment variables affect the execution of
+.Nm date :
 .Bl -tag -width Ds
 .It Ev TZ
 The timezone to use when displaying dates.
@@ -268,9 +274,9 @@
 .Sh FILES
 .Bl -tag -width /var/log/messages -compact
 .It Pa /var/log/wtmp
-a record of date resets and time changes
+record of date resets and time changes
 .It Pa /var/log/messages
-a record of the user setting the time
+record of the user setting the time
 .El
 .Sh SEE ALSO
 .Xr gettimeofday 2 ,
@@ -290,25 +296,25 @@
 if able to set the local date, but unable to set it globally.
 .Pp
 Occasionally, when
-.Xr timed
+.Xr timed 8
 synchronizes the time on many hosts, the setting of a new time value may
 require more than a few seconds.
 On these occasions,
 .Nm
 prints:
-.Ql Network time being set .
+.Dq Network time being set .
 The message
-.Ql Communication error with timed
+.Dq Communication error with timed
 occurs when the communication
 between
 .Nm
 and
-.Xr timed
+.Xr timed 8
 fails.
 .Sh STANDARDS
 The
 .Nm
-command is expected to be compatible with
+utility is expected to be compatible with
 .St -p1003.2 .
 .Sh HISTORY
 A
diff -ur date.orig/date.c date/date.c
--- date.orig/date.c	Sat Aug 28 01:13:59 1999
+++ date/date.c	Wed Oct  6 00:13:54 1999
@@ -50,16 +50,21 @@
 
 #include <ctype.h>
 #include <err.h>
+#include <libutil.h>
+#include <locale.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <syslog.h>
 #include <unistd.h>
-#include <locale.h>
 
 #include "extern.h"
 #include "vary.h"
 
+#ifndef	TM_YEAR_BASE
+#define	TM_YEAR_BASE	1900
+#endif
+
 time_t tval;
 int retval;
 
@@ -67,8 +72,6 @@
 static void badformat __P((void));
 static void usage __P((void));
 
-int logwtmp __P((char *, char *, char *));
-
 int
 main(argc, argv)
 	int argc;
@@ -121,7 +124,7 @@
 				usage();
 			set_timezone = 1;
 			break;
-		case 'u':		/* do everything in GMT */
+		case 'u':		/* do everything in UTC */
 			(void)setenv("TZ", "GMT0", 1);
 			break;
 		case 'v':
@@ -184,6 +187,8 @@
 	register struct tm *lt;
 	struct timeval tv;
 	const char *dot, *t;
+	int bigyear;
+	int yearset = 0;
 
 	if (fmt != NULL) {
 		lt = localtime(&tval);
@@ -221,20 +226,31 @@
 
 		/* if p has a ".ss" field then let's pretend it's not there */
 		switch (strlen(p) - ((dot != NULL) ? 3 : 0)) {
+		case 12:				/* cc */
+			bigyear = ATOI2(p);
+			lt->tm_year = bigyear * 100 - TM_YEAR_BASE;
+			yearset = 1;
+			/* FALLTHROUGH */
 		case 10:				/* yy */
-			lt->tm_year = ATOI2(p);
-			if (lt->tm_year < 69)		/* hack for 2000 ;-} */
-				lt->tm_year += 100;
+			if (yearset) {
+				lt->tm_year += ATOI2(p);
+			} else {
+				lt->tm_year = ATOI2(p);
+				if (lt->tm_year < 69)	/* hack for 2000 ;-} */
+					lt->tm_year += (2000 - TM_YEAR_BASE);
+				else
+					lt->tm_year += (1900 - TM_YEAR_BASE);
+			}
 			/* FALLTHROUGH */
 		case 8:					/* mm */
 			lt->tm_mon = ATOI2(p);
-			if (lt->tm_mon > 12)
+			if ((lt->tm_mon > 12) || !lt->tm_mon)
 				badformat();
 			--lt->tm_mon;		/* time struct is 0 - 11 */
 			/* FALLTHROUGH */
 		case 6:					/* dd */
 			lt->tm_mday = ATOI2(p);
-			if (lt->tm_mday > 31)
+			if ((lt->tm_mday > 31) || !lt->tm_mday)
 				badformat();
 			/* FALLTHROUGH */
 		case 4:					/* HH */
@@ -254,7 +270,7 @@
 
 	/* convert broken-down time to GMT clock time */
 	if ((tval = mktime(lt)) == -1)
-		errx(1, "nonexistent time");
+		errx(1, "specified date is outside allowed range");
 
 	if (!jflag) {
 		/* set the time */
@@ -286,6 +302,7 @@
 	(void)fprintf(stderr, "%s\n%s\n",
 	    "usage: date [-nu] [-d dst] [-r seconds] [-t west] "
 	    "[-v[+|-]val[ymwdHMS]] ... ",
-	    "            [-f fmt date | [[[[yy]mm]dd]HH]MM[.ss]] [+format]");
+	    "            [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] "
+	    "[+format]");
 	exit(1);
 }

>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199910060001.CAA08594>