Author: dumbbell
Date: Sat Apr 26 13:05:56 2014
New Revision: 264968
URL: http://svnweb.freebsd.org/changeset/base/264968

Log:
  date(1): Add "-R" flag to use RFC 2822 date and time output format
  
  As stated in the man page, this is equivalent to use "%a, %d %b %Y %T %z"
  as the output format while LC_TIME is set to the "C" locale.
  
  This is compatible with date(1) from the GNU core utilities.

Modified:
  head/bin/date/date.1
  head/bin/date/date.c

Modified: head/bin/date/date.1
==============================================================================
--- head/bin/date/date.1        Sat Apr 26 12:19:40 2014        (r264967)
+++ head/bin/date/date.1        Sat Apr 26 13:05:56 2014        (r264968)
@@ -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 ,

Modified: head/bin/date/date.c
==============================================================================
--- head/bin/date/date.c        Sat Apr 26 12:19:40 2014        (r264967)
+++ head/bin/date/date.c        Sat Apr 26 13:05:56 2014        (r264968)
@@ -69,12 +69,14 @@ static void setthetime(const char *, con
 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, &lt);
        (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]");
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to