From fd12e98f36bdea018227909378f1adac8e1e1e6f Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 6 Jan 2008 09:54:15 +0100 Subject: touch: ignore "-d now" option, when appropriate * src/touch.c (main): Treat "-d now" as if it were absent, if neither -a nor -m is specified. Problem reported by Dan Jacobson in: http://lists.gnu.org/archive/html/bug-coreutils/2008-01/msg00010.html --- ChangeLog | 7 +++++++ src/touch.c | 22 +++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index f076ad409..9c8d41881 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-01-06 Paul Eggert + + touch: ignore "-d now" option, when appropriate + * src/touch.c (main): Treat "-d now" as if it were absent, if + neither -a nor -m is specified. Problem reported by Dan Jacobson in: + http://lists.gnu.org/archive/html/bug-coreutils/2008-01/msg00010.html + 2008-01-05 Jim Meyering Avoid tr case-conversion failure in some locales. diff --git a/src/touch.c b/src/touch.c index 2540558e5..205fbf6d0 100644 --- a/src/touch.c +++ b/src/touch.c @@ -368,9 +368,29 @@ main (int argc, char **argv) { if (flex_date) { - get_reldate (&newtime[0], flex_date, NULL); + struct timespec now; + gettime (&now); + get_reldate (&newtime[0], flex_date, &now); newtime[1] = newtime[0]; date_set = true; + + /* If neither -a nor -m is specified, treat "-d now" as if + it were absent; this lets "touch" succeed more often in + the presence of restrictive permissions. */ + if (change_times == (CH_ATIME | CH_MTIME) + && newtime[0].tv_sec == now.tv_sec + && newtime[0].tv_nsec == now.tv_nsec) + { + /* Check that it really was "-d now", and not a time + stamp that just happens to be the current time. */ + struct timespec notnow, notnow1; + notnow.tv_sec = now.tv_sec ^ 1; + notnow.tv_nsec = now.tv_nsec; + get_reldate (¬now1, flex_date, ¬now); + if (notnow1.tv_sec == notnow.tv_sec + && notnow1.tv_nsec == notnow.tv_nsec) + date_set = false; + } } } -- cgit v1.2.3-54-g00ecf