]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
touch: ignore "-d now" option, when appropriate
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 6 Jan 2008 08:54:15 +0000 (09:54 +0100)
committerJim Meyering <meyering@redhat.com>
Sun, 6 Jan 2008 08:54:15 +0000 (09:54 +0100)
* 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
src/touch.c

index f076ad409c7c563eadd8141b856e05bfdbcc9a66..9c8d4188128e27f3cfc7775abe216c2bf40e9bc3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-01-06  Paul Eggert  <eggert@cs.ucla.edu>
+
+       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  <meyering@redhat.com>
 
        Avoid tr case-conversion failure in some locales.
index 2540558e55d21324aa0dba58f138198e6abc218d..205fbf6d0fcf8436b192266285bfa9798441d689 100644 (file)
@@ -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 (&notnow1, flex_date, &notnow);
+             if (notnow1.tv_sec == notnow.tv_sec
+                 && notnow1.tv_nsec == notnow.tv_nsec)
+               date_set = false;
+           }
        }
     }