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>
