diff options
| author | Simon J. Gerraty <sjg@FreeBSD.org> | 2014-04-28 07:50:45 +0000 |
|---|---|---|
| committer | Simon J. Gerraty <sjg@FreeBSD.org> | 2014-04-28 07:50:45 +0000 |
| commit | 3b8f08459569bf0faa21473e5cec2491e95c9349 (patch) | |
| tree | 80f45dd81ca716bcd7ca9674581e1fc40b93cd34 /bin/date | |
| parent | 9d2ab4a62d6733c45958627ac113bdbd818d1e2a (diff) | |
| parent | b2ba55951383498f252746f618d513139da06e8e (diff) | |
Notes
Diffstat (limited to 'bin/date')
| -rw-r--r-- | bin/date/Makefile | 6 | ||||
| -rw-r--r-- | bin/date/date.1 | 16 | ||||
| -rw-r--r-- | bin/date/date.c | 24 | ||||
| -rw-r--r-- | bin/date/tests/Makefile | 9 | ||||
| -rw-r--r-- | bin/date/tests/legacy_test.sh | 91 |
5 files changed, 139 insertions, 7 deletions
diff --git a/bin/date/Makefile b/bin/date/Makefile index 4f5c3fea3a587..6da5848e16abb 100644 --- a/bin/date/Makefile +++ b/bin/date/Makefile @@ -1,7 +1,13 @@ # @(#)Makefile 8.1 (Berkeley) 5/31/93 # $FreeBSD$ +.include <bsd.own.mk> + PROG= date SRCS= date.c netdate.c vary.c +.if ${MK_TESTS} != "no" +SUBDIR+= tests +.endif + .include <bsd.prog.mk> diff --git a/bin/date/date.1 b/bin/date/date.1 index d1cbb44571011..5e9e6648d6d00 100644 --- a/bin/date/date.1 +++ b/bin/date/date.1 @@ -32,7 +32,7 @@ .\" @(#)date.1 8.3 (Berkeley) 4/28/95 .\" $FreeBSD$ .\" -.Dd June 3, 2010 +.Dd April 26, 2014 .Dt DATE 1 .Os .Sh NAME @@ -40,7 +40,7 @@ .Nd display or set date and time .Sh SYNOPSIS .Nm -.Op Fl ju +.Op Fl jRu .Op Fl r Ar seconds .Oo .Fl v @@ -58,7 +58,7 @@ .Ar MM Op Ar .ss .Sm on .Nm -.Op Fl jnu +.Op Fl jnRu .Fl f Ar input_fmt new_date .Op Cm + Ns Ar output_fmt .Nm @@ -130,6 +130,16 @@ The .Fl n option suppresses this behavior and causes the time to be set only on the current machine. +.It Fl R +Use RFC 2822 date and time output format. This is equivalent to use +.Dq Li %a, %d %b %Y \&%T %z +as +.Ar output_fmt +while +.Ev LC_TIME +is set to the +.Dq C +locale . .It Fl r Ar seconds Print the date and time represented by .Ar seconds , diff --git a/bin/date/date.c b/bin/date/date.c index 58a9afb0d0fcb..2c09848a151e0 100644 --- a/bin/date/date.c +++ b/bin/date/date.c @@ -69,12 +69,14 @@ static void setthetime(const char *, const char *, int, int); static void badformat(void); static void usage(void); +static const char *rfc2822_format = "%a, %d %b %Y %T %z"; + int main(int argc, char *argv[]) { struct timezone tz; int ch, rflag; - int jflag, nflag; + int jflag, nflag, Rflag; const char *format; char buf[1024]; char *endptr, *fmt; @@ -89,9 +91,9 @@ main(int argc, char *argv[]) (void) setlocale(LC_TIME, ""); tz.tz_dsttime = tz.tz_minuteswest = 0; rflag = 0; - jflag = nflag = 0; + jflag = nflag = Rflag = 0; set_timezone = 0; - while ((ch = getopt(argc, argv, "d:f:jnr:t:uv:")) != -1) + while ((ch = getopt(argc, argv, "d:f:jnRr:t:uv:")) != -1) switch((char)ch) { case 'd': /* daylight savings time */ tz.tz_dsttime = strtol(optarg, &endptr, 10) ? 1 : 0; @@ -108,6 +110,9 @@ main(int argc, char *argv[]) case 'n': /* don't set network */ nflag = 1; break; + case 'R': /* RFC 2822 datetime format */ + Rflag = 1; + break; case 'r': /* user specified seconds */ rflag = 1; tval = strtoq(optarg, &tmp, 0); @@ -145,6 +150,9 @@ main(int argc, char *argv[]) format = "%+"; + if (Rflag) + format = rfc2822_format; + /* allow the operands in any order */ if (*argv && **argv == '+') { format = *argv + 1; @@ -169,6 +177,14 @@ main(int argc, char *argv[]) usage(); } vary_destroy(v); + + if (format == rfc2822_format) + /* + * When using RFC 2822 datetime format, don't honor the + * locale. + */ + setlocale(LC_TIME, "C"); + (void)strftime(buf, sizeof(buf), format, <); (void)printf("%s\n", buf); if (fflush(stdout)) @@ -301,7 +317,7 @@ static void usage(void) { (void)fprintf(stderr, "%s\n%s\n", - "usage: date [-jnu] [-d dst] [-r seconds] [-t west] " + "usage: date [-jnRu] [-d dst] [-r seconds] [-t west] " "[-v[+|-]val[ymwdHMS]] ... ", " " "[-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]"); diff --git a/bin/date/tests/Makefile b/bin/date/tests/Makefile new file mode 100644 index 0000000000000..2301dcf203d10 --- /dev/null +++ b/bin/date/tests/Makefile @@ -0,0 +1,9 @@ +# $FreeBSD$ + +.include <bsd.own.mk> + +TESTSDIR= ${TESTSBASE}/bin/date + +TAP_TESTS_SH= legacy_test + +.include <bsd.test.mk> diff --git a/bin/date/tests/legacy_test.sh b/bin/date/tests/legacy_test.sh new file mode 100644 index 0000000000000..981bdd017168e --- /dev/null +++ b/bin/date/tests/legacy_test.sh @@ -0,0 +1,91 @@ +#!/bin/sh + +# +# Regression tests for date(1) +# +# Submitted by Edwin Groothuis <edwin@FreeBSD.org> +# +# $FreeBSD$ +# + +# +# These two date/times have been chosen carefully, they +# create both the single digit and double/multidigit version of +# the values. +# +# To create a new one, make sure you are using the UTC timezone! +# + +TEST1=3222243 # 1970-02-07 07:04:03 +TEST2=1005600000 # 2001-11-12 21:11:12 + +export LC_ALL=C +export TZ=UTC +count=0 + +check() +{ + S=$1 + A1=$2 + A2=$3 + + count=`expr ${count} + 1` + + if [ -z "${A2}" ]; then A2=${A1}; fi + + R=`date -r ${TEST1} +%${S}` + if [ "${R}" = "${A1}" ]; then + echo "ok ${S}{t1}" + else + echo "no ok ${S}{t1} - (got ${R}, expected ${A1})" + fi + + R=`date -r ${TEST2} +%${S}` + if [ "${R}" = "${A2}" ]; then + echo "ok ${S}{t2}" + else + echo "no ok ${S}{t2} - (got ${R}, expected ${A2})" + fi +} + +echo "1..78" + +check A Saturday Monday +check a Sat Mon +check B February November +check b Feb Nov +check C 19 20 +check c "Sat Feb 7 07:04:03 1970" "Mon Nov 12 21:20:00 2001" +check D 02/07/70 11/12/01 +check d 07 12 +check e " 7" 12 +check F "1970-02-07" "2001-11-12" +check G 1970 2001 +check g 70 01 +check H 07 21 +check h Feb Nov +check I 07 09 +check j 038 316 +check k " 7" 21 +check l " 7" " 9" +check M 04 20 +check m 02 11 +check p AM PM +check R 07:04 21:20 +check r "07:04:03 AM" "09:20:00 PM" +check S 03 00 +check s ${TEST1} ${TEST2} +check U 05 45 +check u 6 1 +check V 06 46 +check v " 7-Feb-1970" "12-Nov-2001" +check W 05 46 +check w 6 1 +check X "07:04:03" "21:20:00" +check x "02/07/70" "11/12/01" +check Y 1970 2001 +check y 70 01 +check Z UTC UTC +check z +0000 +0000 +check % % % +check + "Sat Feb 7 07:04:03 UTC 1970" "Mon Nov 12 21:20:00 UTC 2001" |
