The login applet should always be setuid root
[oweals/busybox.git] / coreutils / date.c
index 1aa3e22d23d413e49196f04dbede0421a5715ce9..26251c37ba5cebe613b8fe6dcd2566295bf4d97b 100644 (file)
@@ -3,7 +3,7 @@
  * Mini date implementation for busybox
  *
  * by Matthew Grant <grantma@anathoth.gen.nz>
- * 
+ *
  * iso-format handling added by Robert Griebl <griebl@gmx.de>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -33,7 +33,7 @@
 #include "busybox.h"
 
 
-/* This 'date' command supports only 2 time setting formats, 
+/* This 'date' command supports only 2 time setting formats,
    all the GNU strftime stuff (its in libc, lets use it),
    setting time using UTC and displaying int, as well as
    an RFC 822 complient date output for shell scripting
@@ -42,7 +42,7 @@
 /* Input parsing code is always bulky - used heavy duty libc stuff as
    much as possible, missed out a lot of bounds checking */
 
-/* Default input handling to save suprising some people */
+/* Default input handling to save surprising some people */
 
 static struct tm *date_conv_time(struct tm *tm_time, const char *t_string)
 {
@@ -118,8 +118,9 @@ static struct tm *date_conv_ftime(struct tm *tm_time, const char *t_string)
 #define DATE_OPT_SET           0x02
 #define DATE_OPT_UTC           0x04
 #define DATE_OPT_DATE          0x08
+#define DATE_OPT_REFERENCE     0x10
 #ifdef CONFIG_FEATURE_DATE_ISOFMT
-# define DATE_OPT_TIMESPEC     0x10
+# define DATE_OPT_TIMESPEC     0x20
 #endif
 
 int date_main(int argc, char **argv)
@@ -133,6 +134,7 @@ int date_main(int argc, char **argv)
        time_t tm;
        unsigned long opt;
        struct tm tm_time;
+       char *filename = NULL;
 
 #ifdef CONFIG_FEATURE_DATE_ISOFMT
        int ifmt = 0;
@@ -143,8 +145,8 @@ int date_main(int argc, char **argv)
 # define GETOPT_ISOFMT
 #endif
        bb_opt_complementaly = "d~ds:s~ds";
-       opt = bb_getopt_ulflags(argc, argv, "Rs:ud:" GETOPT_ISOFMT,
-                                       &date_str, &date_str
+       opt = bb_getopt_ulflags(argc, argv, "Rs:ud:r:" GETOPT_ISOFMT,
+                                       &date_str, &date_str, &filename
 #ifdef CONFIG_FEATURE_DATE_ISOFMT
                                        , &isofmt_arg
 #endif
@@ -194,7 +196,12 @@ int date_main(int argc, char **argv)
        /* Now we have parsed all the information except the date format
           which depends on whether the clock is being set or read */
 
-       time(&tm);
+       if(filename) {
+               struct stat statbuf;
+               if(stat(filename,&statbuf))
+                       bb_perror_msg_and_die("File '%s' not found.\n",filename);
+               tm=statbuf.st_mtime;
+       } else time(&tm);
        memcpy(&tm_time, localtime(&tm), sizeof(tm_time));
        /* Zero out fields - take her back to midnight! */
        if (date_str != NULL) {
@@ -246,10 +253,10 @@ int date_main(int argc, char **argv)
                case 0:
                default:
 #endif
-                       date_fmt =
-                               (opt & DATE_OPT_RFC2822
-                                ? (utc ? "%a, %e %b %Y %H:%M:%S GMT" :
-                                       "%a, %e %b %Y %H:%M:%S %z") : "%a %b %e %H:%M:%S %Z %Y");
+                       date_fmt = (opt & DATE_OPT_RFC2822 ?
+                                       (utc ? "%a, %d %b %Y %H:%M:%S GMT" :
+                                       "%a, %d %b %Y %H:%M:%S %z") :
+                                       "%a %b %e %H:%M:%S %Z %Y");
 
 #ifdef CONFIG_FEATURE_DATE_ISOFMT
                        break;