touch: implement -d --date (our own testsuite needs that)
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 18 Jul 2009 01:41:29 +0000 (03:41 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 18 Jul 2009 01:41:29 +0000 (03:41 +0200)
function                                             old     new   delta
static.uname_longopts                                  -     137    +137
touch_main                                           231     360    +129
static.touch_longopts                                  -      32     +32
validate_tm_time                                       -      28     +28
packed_usage                                       26616   26624      +8
date_main                                            687     686      -1
static.longopts                                      162       -    -162
------------------------------------------------------------------------------
(add/remove: 3/1 grow/shrink: 2/1 up/down: 334/-163)          Total: 171 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
12 files changed:
coreutils/date.c
coreutils/touch.c
coreutils/uname.c
include/libbb.h
include/usage.h
libbb/time.c
testsuite/bunzip2.tests
testsuite/bzcat.tests
testsuite/cp/cp-a-files-to-dir
testsuite/mv/mv-files-to-dir
testsuite/mv/mv-refuses-mv-dir-to-subdir
testsuite/runtest

index 7f2a5b3510801935cf247126ecf62eab6154267d..09ced0ea120320ab2d001d6b94d2864e5bd7cedd 100644 (file)
@@ -142,12 +142,11 @@ int date_main(int argc UNUSED_PARAM, char **argv)
                } else {
                        parse_datestr(date_str, &tm_time);
                }
+
                /* Correct any day of week and day of year etc. fields */
                tm_time.tm_isdst = -1;  /* Be sure to recheck dst */
-               tm = mktime(&tm_time);
-               if (tm < 0) {
-                       bb_error_msg_and_die(bb_msg_invalid_date, date_str);
-               }
+               tm = validate_tm_time(date_str, &tm_time);
+
                maybe_set_utc(opt);
 
                /* if setting time, set it */
index 7d434a233a3b6305ea30e447d6cad051486f76c8..1b4a5f0ea018b722e8e68e8cd836271827139873 100644 (file)
@@ -41,31 +41,34 @@ int touch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int touch_main(int argc UNUSED_PARAM, char **argv)
 {
 #if ENABLE_DESKTOP
-#if ENABLE_LONG_OPTS
-       static const char longopts[] ALIGN1 =
+# if ENABLE_LONG_OPTS
+       static const char touch_longopts[] ALIGN1 =
                /* name, has_arg, val */
                "no-create\0"         No_argument       "c"
                "reference\0"         Required_argument "r"
+               "date\0"              Required_argument "d"
        ;
-#endif
+# endif
        struct utimbuf timebuf;
        char *reference_file = NULL;
+       char *date_str = NULL;
 #else
-#define reference_file NULL
-#define timebuf        (*(struct utimbuf*)NULL)
+# define reference_file NULL
+# define date_str       NULL
+# define timebuf        (*(struct utimbuf*)NULL)
 #endif
        int fd;
        int status = EXIT_SUCCESS;
        int opts;
 
-#if ENABLE_DESKTOP
-#if ENABLE_LONG_OPTS
-       applet_long_options = longopts;
+#if ENABLE_DESKTOP && ENABLE_LONG_OPTS
+       applet_long_options = touch_longopts;
 #endif
-#endif
-       opts = getopt32(argv, "c" IF_DESKTOP("r:")
+       opts = getopt32(argv, "c" IF_DESKTOP("r:d:")
                                /*ignored:*/ "fma"
-                               IF_DESKTOP(, &reference_file));
+                               IF_DESKTOP(, &reference_file)
+                               IF_DESKTOP(, &date_str)
+       );
 
        opts &= 1; /* only -c bit is left */
        argv += optind;
@@ -80,6 +83,23 @@ int touch_main(int argc UNUSED_PARAM, char **argv)
                timebuf.modtime = stbuf.st_mtime;
        }
 
+       if (date_str) {
+               struct tm tm_time;
+               time_t t;
+
+               //time(&t);
+               //localtime_r(&t, &tm_time);
+               memset(&tm_time, 0, sizeof(tm_time));
+               parse_datestr(date_str, &tm_time);
+
+               /* Correct any day of week and day of year etc. fields */
+               tm_time.tm_isdst = -1;  /* Be sure to recheck dst */
+               t = validate_tm_time(date_str, &tm_time);
+
+               timebuf.actime = t;
+               timebuf.modtime = t;
+       }
+
        do {
                if (utime(*argv, reference_file ? &timebuf : NULL)) {
                        if (errno == ENOENT) { /* no such file */
index df45660636b181affaa8b34b046017d391378578..8453bcc0171afa6c1679d78fb9b737264821e104 100644 (file)
@@ -74,7 +74,7 @@ int uname_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int uname_main(int argc UNUSED_PARAM, char **argv)
 {
 #if ENABLE_LONG_OPTS
-       static const char longopts[] ALIGN1 =
+       static const char uname_longopts[] ALIGN1 =
                /* name, has_arg, val */
                "all\0"               No_argument       "a"
                "kernel-name\0"       No_argument       "s"
@@ -97,7 +97,7 @@ int uname_main(int argc UNUSED_PARAM, char **argv)
        const unsigned short *delta;
        unsigned toprint;
 
-       IF_LONG_OPTS(applet_long_options = longopts);
+       IF_LONG_OPTS(applet_long_options = uname_longopts);
        toprint = getopt32(argv, options);
 
        if (argv[optind]) { /* coreutils-6.9 compat */
index 9de52331b75b9182076cd66348c793f7b59f51ba..936d98a23947cf5d940860accb8464d6de212e34 100644 (file)
@@ -438,6 +438,7 @@ struct BUG_too_small {
 
 
 void parse_datestr(const char *date_str, struct tm *tm_time) FAST_FUNC;
+time_t validate_tm_time(const char *date_str, struct tm *tm_time) FAST_FUNC;
 
 
 int xsocket(int domain, int type, int protocol) FAST_FUNC;
index 53ae0a8ccb5fd6c0ddb5552dd919e615bcd35cfe..9493b6d4bdefb6a66d1833fc6aa533bfdca9833a 100644 (file)
        "and show the status for however many processes will fit on the screen." \
 
 #define touch_trivial_usage \
-       "[-c] FILE [FILE]..."
+       "[-c] [-d DATE] FILE [FILE]..."
 #define touch_full_usage "\n\n" \
        "Update the last-modified date on the given FILE[s]\n" \
      "\nOptions:" \
-     "\n       -c      Do not create any files" \
+     "\n       -c      Do not create files" \
+     "\n       -d DT   Date/time to use" \
 
 #define touch_example_usage \
        "$ ls -l /tmp/foo\n" \
index 30b760f71a863de068c963ba7d25b0921fd7c25c..1cf2a050e1a415001eceb446a36c66b6d46b359b 100644 (file)
@@ -71,6 +71,15 @@ void FAST_FUNC parse_datestr(const char *date_str, struct tm *tm_time)
        }
 }
 
+time_t FAST_FUNC validate_tm_time(const char *date_str, struct tm *tm_time)
+{
+       time_t t = mktime(tm_time);
+       if (t == (time_t) -1L) {
+               bb_error_msg_and_die(bb_msg_invalid_date, date_str);
+       }
+       return t;
+}
+
 #if ENABLE_MONOTONIC_SYSCALL
 
 #include <sys/syscall.h>
index a7555aca9284ddd794b609f2b49a443a1a159bb3..7875cd1aef382c5475bfa02ac73d2f04c62131ba 100755 (executable)
@@ -517,8 +517,8 @@ if test "${0##*/}" = "bunzip2.tests"; then
     if test1_bz2 | ${bb}bunzip2 >/dev/null \
        && test "`test1_bz2 | ${bb}bunzip2 | md5sum`" = "61bbeee4be9c6f110a71447f584fda7b  -"
     then
-       echo "$unpack: test bz2 file: PASS"
+       echo "PASS: $unpack: test bz2 file"
     else
-       echo "$unpack: test bz2 file: FAIL"
+       echo "FAIL: $unpack: test bz2 file"
     fi
 fi
index 0bc7442449c9bd0c8bb35fc5d8e2ee8dabf32fab..78d74f22995a218ef1829b2ebdc621d7dce3b765 100755 (executable)
@@ -32,9 +32,9 @@ prep() {
 check() {
     eval $2 >t_actual 2>&1
     if $ECHO -ne "$expected" | cmp - t_actual; then
-       echo "$1: PASS"
+       echo "PASS: $1"
     else
-       echo "$1: FAIL"
+       echo "FAIL: $1"
     fi
 }
 
index abdbdf77d6d409934aca4dfe74d5ca6a80be9563..b199ef9b96cfb5a96636741bc0b54e5599e95cd6 100644 (file)
@@ -3,7 +3,7 @@ echo file number two > file2
 ln -s file2 link1
 mkdir dir1
 # why???
-#touch --date='Sat Jan 29 21:24:08 PST 2000' dir1/file3
+#TZ=UTC0 touch -d '2000-01-30 05:24:08' dir1/file3
 mkdir there
 busybox cp -a file1 file2 link1 dir1 there
 test -f there/file1
index c8eaba88ed1fdea5b45fff469dd07fda219c1f9d..2b567f77f3712ec771b10be2a6722add38105790 100644 (file)
@@ -2,7 +2,7 @@ echo file number one > file1
 echo file number two > file2
 ln -s file2 link1
 mkdir dir1
-touch --date='Sat Jan 29 21:24:08 PST 2000' dir1/file3
+TZ=UTC0 touch -d '2000-01-30 05:24:08' dir1/file3
 mkdir there
 busybox mv file1 file2 link1 dir1 there
 test -f there/file1
index 7c572c4f8fc59e3dde35812bbc9a97086304499d..3bad131a6ec06f88593c74e0cab9bebd94422590 100644 (file)
@@ -2,7 +2,7 @@ echo file number one > file1
 echo file number two > file2
 ln -s file2 link1
 mkdir dir1
-touch --date='Sat Jan 29 21:24:08 PST 2000' dir1/file3
+TZ=UTC0 touch -d '2000-01-30 05:24:08' dir1/file3
 mkdir there
 busybox mv file1 file2 link1 dir1 there
 test -f there/file1
index 2d60591fb1206787e39942ee65be7be70e7fa83d..5560f7bc230ec3ce0d7ddf641b738f29d6ab1a85 100755 (executable)
@@ -120,12 +120,17 @@ fi
 
 # Populate a directory with links to all busybox applets
 
-# Note: if $LINKSDIR/applet exists, we do not overwrite it.
-# Useful if one wants to run tests against a standard utility, not an applet.
 LINKSDIR="$bindir/runtest-tempdir-links"
-#rm -rf "$LINKSDIR" 2>/dev/null
+
+# Comment this line out if you have put a different binary in $LINKSDIR
+# (say, a "standard" tool's binary) in order to run tests against it:
+rm -rf "$LINKSDIR" 2>/dev/null
+
 mkdir "$LINKSDIR" 2>/dev/null
 for i in $implemented; do
+       # Note: if $LINKSDIR/applet exists, we do not overwrite it.
+       # Useful if one wants to run tests against a standard utility,
+       # not an applet.
        ln -s "$bindir/busybox" "$LINKSDIR/$i" 2>/dev/null
 done