[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: 664 vs. touch -d now
From: |
Paul Eggert |
Subject: |
Re: 664 vs. touch -d now |
Date: |
Thu, 03 Jan 2008 11:39:53 -0800 |
User-agent: |
Gnus/5.11 (Gnus v5.11) Emacs/22.1 (gnu/linux) |
address@hidden writes:
> Well at least: Ah ha, isn't "now" the current time? Bug! Muhahaha.
Thanks for the bug report. Here is a patch. It's not that easy to
write up a test case, due to the permissions issues, so I omitted
that.
2008-01-03 Paul Eggert <address@hidden>
* 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
diff --git a/src/touch.c b/src/touch.c
index 2540558..205fbf6 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;
+ }
}
}