diff options
| -rwxr-xr-x | tests/touch.test | 3 | ||||
| -rw-r--r-- | toys/posix/touch.c | 24 | 
2 files changed, 19 insertions, 8 deletions
| diff --git a/tests/touch.test b/tests/touch.test index 1b71c5eb..263e9a0f 100755 --- a/tests/touch.test +++ b/tests/touch.test @@ -32,6 +32,9 @@ testing "-t seconds" \    "touch -t 201201231234.56 walrus && date -r walrus +%Y%m%d-%H%M%S.%N" \    "20120123-123456.000000000\n" "" "" +testing "-t -" "touch -t 200109081946.40 - > walrus && date -r walrus +%s" \ +   "1000000000\n" "" "" +  testing "-t nanoseconds" \    "touch -t 201201231234.56123456789 walrus && date -r walrus +%Y%m%d-%H%M%S.%N" \    "20120123-123456.123456789\n" "" "" diff --git a/toys/posix/touch.c b/toys/posix/touch.c index c18087a9..79eba177 100644 --- a/toys/posix/touch.c +++ b/toys/posix/touch.c @@ -4,7 +4,7 @@   *   * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/touch.html -USE_TOUCH(NEWTOY(touch, "acd:mr:t:h[!dtr]", TOYFLAG_BIN)) +USE_TOUCH(NEWTOY(touch, "<1acd:mr:t:h[!dtr]", TOYFLAG_BIN))  config TOUCH    bool "touch" @@ -115,13 +115,21 @@ void touch_main(void)    // Loop through files on command line    for (ss = toys.optargs; *ss;) { +    char *s = *ss++; -    // cheat: FLAG_h is rightmost flag, so its value is 1 -    if (!utimensat(AT_FDCWD, *ss, ts, -        (toys.optflags & FLAG_h)*AT_SYMLINK_NOFOLLOW)) ss++; -    else if (toys.optflags & FLAG_c) ss++; -    else if (access(*ss, F_OK) && (-1!=(fd = open(*ss, O_CREAT, 0666)))) -      close(fd); -    else perror_msg("'%s'", *ss++); +    if (!strcmp(s, "-")) { +      if (!futimens(1, ts)) continue; +    } else { +      // cheat: FLAG_h is rightmost flag, so its value is 1 +      if (!utimensat(AT_FDCWD, s, ts, +          (toys.optflags & FLAG_h)*AT_SYMLINK_NOFOLLOW)) continue; +      if (toys.optflags & FLAG_c) continue; +      if (access(s, F_OK) && (-1!=(fd = open(s, O_CREAT, 0666)))) { +        close(fd); +        if (toys.optflags) ss--; +        continue; +      } +    } +    perror_msg("'%s'", s);    }  } | 
