OSDN Git Service

Fix touch -t seconds parsing
authorDavis Mosenkovs <davikovs@gmail.com>
Wed, 20 Apr 2016 21:44:13 +0000 (14:44 -0700)
committerRob Landley <rob@landley.net>
Thu, 21 Apr 2016 22:16:13 +0000 (17:16 -0500)
tests/touch.test
toys/posix/touch.c

index d386156..d193d7c 100755 (executable)
@@ -11,6 +11,18 @@ testing "-c" "touch -c walrus && [ -e walrus ] && echo yes" "yes\n" "" ""
 testing "-c missing" "touch -c warrus && [ ! -e warrus ] && echo yes" \
   "yes\n" "" ""
 
+testing "-t" \
+  "touch -t 201201231234 walrus && date -r walrus +%Y%m%d-%H%M%S.%N" \
+  "20120123-123400.000000000\n" "" ""
+
+testing "-t seconds" \
+  "touch -t 201201231234.56 walrus && date -r walrus +%Y%m%d-%H%M%S.%N" \
+  "20120123-123456.000000000\n" "" ""
+
+testing "-t nanoseconds" \
+  "touch -t 201201231234.56123456789 walrus && date -r walrus +%Y%m%d-%H%M%S.%N" \
+  "20120123-123456.123456789\n" "" ""
+
 testing "-d" \
   "touch -d 2009-02-13T23:31:30Z walrus && date -r walrus +%s" \
   "1234567890\n" "" ""
index 052448b..22a1e2e 100644 (file)
@@ -80,10 +80,13 @@ void touch_main(void)
         if (s) break;
         toybuf[1]='y';
       }
+      tm.tm_sec = 0;
       ts->tv_nsec = 0;
       if (s && *s=='.' && sscanf(s, ".%2u%n", &(tm.tm_sec), &len) == 1) {
-        sscanf(s += len, "%lu%n", &ts->tv_nsec, &len);
-        len++;
+        if (sscanf(s += len, "%lu%n", &ts->tv_nsec, &len) == 1) {
+          s--;
+          len++;
+        } else len = 0;
       } else len = 0;
     }
     if (len) {