Pull up the following revisions, requested by kim in ticket #1640:

bin/date/Makefile                               up to 1.16
	bin/date/date.1                                 up to 1.54
	bin/date/date.c                                 up to 1.65

Add -R option for displaying time in RFC 5322 format, similar to GNU date.
Add -f option to set the time. From FreeBSD.
This commit is contained in:
martin 2023-06-03 15:27:13 +00:00
parent 423383f8ab
commit 8d16f5c5d6
3 changed files with 129 additions and 38 deletions

View File

@ -1,10 +1,15 @@
# $NetBSD: Makefile,v 1.15 2011/08/14 10:53:16 christos Exp $
# $NetBSD: Makefile,v 1.15.46.1 2023/06/03 15:27:13 martin Exp $
# @(#)Makefile 8.1 (Berkeley) 5/31/93
.include <bsd.init.mk>
PROG= date
SRCS= date.c netdate.c
SRCS= date.c
.if !defined(HOSTPROG)
SRCS+= netdate.c
DPADD+= ${LIBUTIL}
LDADD+= -lutil
.endif
CPPFLAGS+=-I${.CURDIR}
COPTS.date.c = -Wno-format-nonliteral

View File

@ -1,4 +1,4 @@
.\" $NetBSD: date.1,v 1.47 2018/01/27 18:59:38 wiz Exp $
.\" $NetBSD: date.1,v 1.47.6.1 2023/06/03 15:27:13 martin Exp $
.\"
.\" Copyright (c) 1980, 1990, 1993
.\" The Regents of the University of California. All rights reserved.
@ -32,7 +32,7 @@
.\"
.\" @(#)date.1 8.3 (Berkeley) 4/28/95
.\"
.Dd January 25, 2018
.Dd May 31, 2023
.Dt DATE 1
.Os
.Sh NAME
@ -40,19 +40,27 @@
.Nd display or set date and time
.Sh SYNOPSIS
.Nm
.Op Fl ajnu
.Op Fl ajnRu
.Op Fl d Ar date
.Op Fl r Ar seconds
.Op Cm + Ns Ar format
.Sm off
.Oo Oo Oo Oo Oo Oo
.Oo
.Oo Oo Oo Oo Oo
.Ar CC Oc
.Ar yy Oc
.Ar mm Oc
.Ar dd Oc
.Ar HH Oc Ar MM Oo
.Li \&. Ar SS Oc Oc
.Ar HH Oc
.Ar MM
.Op Cm \&. Ar SS
.Oc
.Sm on
.Nm
.Op Fl ajnRu
.Fl f Ar input_format
.Ar new_date
.Op Cm + Ns Ar format
.Sh DESCRIPTION
.Nm
displays the current date and time when invoked without arguments.
@ -61,7 +69,7 @@ way or set the date.
Only the superuser may set the date.
.Pp
The options are as follows:
.Bl -tag -width Ds
.Bl -tag -width Fl
.It Fl a
Use
.Xr adjtime 2
@ -76,6 +84,25 @@ actually changing the system clock.
(See
.Xr parsedate 3
for examples.)
.It Fl f Ar input_fmt
Use
.Ar input_fmt
as the format string to parse the
.Ar new_date
provided rather than using the default
.Sm off
.Oo Oo Oo Oo Oo
.Ar CC Oc
.Ar yy Oc
.Ar mm Oc
.Ar dd Oc
.Ar HH Oc
.Ar MM
.Op Cm \&. Ar SS
.Sm on
format.
Parsing is done using
.Xr strptime 3 .
.It Fl j
Parse the provided canonical representation of date and time (described below)
and display the result without actually changing the system clock.
@ -93,6 +120,9 @@ The
option stops
.Nm
from setting the time for other than the current machine.
.It Fl R
Use a default display format that conforms to the date and time
specification in RFC 5322 (Internet Message Format).
.It Fl r Ar seconds
Print out the date and time that is
.Ar seconds
@ -109,12 +139,13 @@ The format string may contain any of the conversion specifications described
in the
.Xr strftime 3
manual page, as well as any arbitrary text.
A <newline> character is always output after the characters
A
.Aq newline
character is always output after the characters
specified by the format string.
The format string for the default display is:
.Bd -literal -offset indent
%a %b %e %H:%M:%S %Z %Y
.Ed
.Pp
.Dl %a %b %e %H:%M:%S %Z %Y
.Pp
If an operand does not have a leading plus sign, it is interpreted as
a value for setting the system's notion of the current date and time.
@ -156,7 +187,7 @@ and years are handled automatically.
.Sh ENVIRONMENT
The following environment variables affect the execution of
.Nm :
.Bl -tag -width iTZ
.Bl -tag -width Ev
.It Ev TZ
The timezone to use when displaying dates.
See
@ -164,13 +195,14 @@ See
for more information.
.El
.Sh FILES
.Bl -tag -width /usr/share/zoneinfo/posixrules -compact
.Bl -tag -width Pa -compact
.It Pa /etc/localtime
Symlink pointing to system's default timezone information file in
.Pa /usr/share/zoneinfo
directory.
.It Pa /usr/lib/locale/<L>/LC_TIME
Description of time locale <L>.
.It Pa /usr/lib/locale/ Ns Ao Ar L Ac Ns Pa /LC_TIME
Description of time locale
.Aq Ar L .
.It Pa /usr/share/zoneinfo
Time zone information directory.
.It Pa /usr/share/zoneinfo/posixrules
@ -189,9 +221,8 @@ is absent, UTC leap seconds are loaded from
.Pa /usr/share/zoneinfo/posixrules .
.Sh EXAMPLES
The command:
.Bd -literal -offset indent
date '+DATE: %m/%d/%y%nTIME: %H:%M:%S'
.Ed
.Pp
.Dl date '+DATE: %m/%d/%y%nTIME: %H:%M:%S'
.Pp
will display:
.Bd -literal -offset indent
@ -200,21 +231,25 @@ TIME: 13:36:16
.Ed
.Pp
The command:
.Bd -literal -offset indent
date 8506131627
.Ed
.Pp
.Dl date 8506131627
.Pp
sets the date to
.Dq Li "June 13, 1985, 4:27 PM" .
.Pp
The command:
.Bd -literal -offset indent
date 1432
.Ed
.Pp
.Dl date 1432
.Pp
sets the time to
.Li "2:32 PM" ,
without modifying the date.
.Pp
The command:
.Pp
.Dl date +%s
.Pp
prints the current time as seconds since the 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.

View File

@ -1,4 +1,4 @@
/* $NetBSD: date.c,v 1.61 2014/09/01 21:42:21 dholland Exp $ */
/* $NetBSD: date.c,v 1.61.18.1 2023/06/03 15:27:13 martin Exp $ */
/*
* Copyright (c) 1985, 1987, 1988, 1993
@ -29,6 +29,10 @@
* SUCH DAMAGE.
*/
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#endif
#include <sys/cdefs.h>
#ifndef lint
__COPYRIGHT(
@ -40,7 +44,7 @@ __COPYRIGHT(
#if 0
static char sccsid[] = "@(#)date.c 8.2 (Berkeley) 4/28/95";
#else
__RCSID("$NetBSD: date.c,v 1.61 2014/09/01 21:42:21 dholland Exp $");
__RCSID("$NetBSD: date.c,v 1.61.18.1 2023/06/03 15:27:13 martin Exp $");
#endif
#endif /* not lint */
@ -60,11 +64,15 @@ __RCSID("$NetBSD: date.c,v 1.61 2014/09/01 21:42:21 dholland Exp $");
#include <tzfile.h>
#include <unistd.h>
#include <util.h>
#if !HAVE_NBTOOL_CONFIG_H
#include <utmpx.h>
#endif
#include "extern.h"
static time_t tval;
static int aflag, jflag, rflag, nflag;
static int Rflag, aflag, jflag, rflag, nflag;
static char *fmt;
__dead static void badcanotime(const char *, const char *, size_t);
static void setthetime(const char *);
@ -83,13 +91,14 @@ main(int argc, char *argv[])
setprogname(argv[0]);
(void)setlocale(LC_ALL, "");
while ((ch = getopt(argc, argv, "ad:jnr:u")) != -1) {
while ((ch = getopt(argc, argv, "ad:f:jnRr:u")) != -1) {
switch (ch) {
case 'a': /* adjust time slowly */
aflag = 1;
nflag = 1;
break;
case 'd':
#ifndef HAVE_NBTOOL_CONFIG_H
rflag = 1;
tval = parsedate(optarg, NULL, NULL);
if (tval == -1) {
@ -97,12 +106,22 @@ main(int argc, char *argv[])
"%s: Unrecognized date format", optarg);
}
break;
#else
errx(EXIT_FAILURE,
"-d not supported in the tool version");
#endif
case 'f':
fmt = optarg;
break;
case 'j': /* don't set time */
jflag = 1;
break;
case 'n': /* don't set network */
nflag = 1;
break;
case 'R': /* RFC-5322 email format */
Rflag = 1;
break;
case 'r': /* user specified seconds */
if (optarg[0] == '\0') {
errx(EXIT_FAILURE, "<empty>: Invalid number");
@ -137,13 +156,17 @@ main(int argc, char *argv[])
if (*argv && **argv == '+') {
format = *argv;
++argv;
} else if (Rflag) {
(void)setlocale(LC_TIME, "C");
format = "+%a, %-e %b %Y %H:%M:%S %z";
} else
format = "+%a %b %e %H:%M:%S %Z %Y";
if (*argv) {
setthetime(*argv);
++argv;
}
} else if (fmt)
usage();
if (*argv && **argv == '+')
format = *argv;
@ -186,6 +209,22 @@ setthetime(const char *p)
size_t len;
int yearset;
if ((lt = localtime(&tval)) == NULL)
err(EXIT_FAILURE, "%lld: localtime", (long long)tval);
lt->tm_isdst = -1; /* Divine correct DST */
if (fmt) {
t = strptime(p, fmt, lt);
if (t == NULL) {
warnx("Failed conversion of ``%s''"
" using format ``%s''\n", p, fmt);
} else if (*t != '\0')
warnx("Ignoring %zu extraneous"
" characters in date string (%s)",
strlen(t), t);
goto setit;
}
for (t = p, dot = NULL; *t; ++t) {
if (*t == '.') {
if (dot == NULL) {
@ -198,10 +237,6 @@ setthetime(const char *p)
}
}
if ((lt = localtime(&tval)) == NULL)
err(EXIT_FAILURE, "%lld: localtime", (long long)tval);
lt->tm_isdst = -1; /* Divine correct DST */
if (dot != NULL) { /* .ss */
len = strlen(dot);
@ -316,11 +351,11 @@ setthetime(const char *p)
badcanotime("Not enough digits", p, strlen(p) - len);
}
}
setit:
/* convert broken-down time to UTC clock time */
if ((new_time = mktime(lt)) == -1) {
/* Can this actually happen? */
err(EXIT_FAILURE, "%s: mktime", op);
err(EXIT_FAILURE, "mktime");
}
/* if jflag is set, don't actually change the time, just return */
@ -330,6 +365,13 @@ setthetime(const char *p)
}
/* set the time */
#ifndef HAVE_NBTOOL_CONFIG_H
struct utmpx utx;
memset(&utx, 0, sizeof(utx));
utx.ut_type = OLD_TIME;
(void)gettimeofday(&utx.ut_tv, NULL);
pututxline(&utx);
if (nflag || netsettime(new_time)) {
logwtmp("|", "date", "");
if (aflag) {
@ -346,19 +388,28 @@ setthetime(const char *p)
}
logwtmp("{", "date", "");
}
utx.ut_type = NEW_TIME;
(void)gettimeofday(&utx.ut_tv, NULL);
pututxline(&utx);
if ((p = getlogin()) == NULL)
p = "???";
syslog(LOG_AUTH | LOG_NOTICE, "date set by %s", p);
#else
errx(EXIT_FAILURE, "Can't set the time in the tools version");
#endif
}
static void
usage(void)
{
(void)fprintf(stderr,
"Usage: %s [-ajnu] [-d date] [-r seconds] [+format]",
"Usage: %s [-ajnRu] [-d date] [-r seconds] [+format]",
getprogname());
(void)fprintf(stderr, " [[[[[[CC]yy]mm]dd]HH]MM[.SS]]\n");
(void)fprintf(stderr,
" %s [-ajnRu] -f input_format new_date [+format]\n",
getprogname());
exit(EXIT_FAILURE);
/* NOTREACHED */
}