aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ChangeLog5
-rw-r--r--src/fileio.c23
2 files changed, 23 insertions, 5 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 2864d8f129..5ae6ce6ebf 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+2002-03-09 Jason Rumney <[email protected]>
+
+ * fileio.c (Fcopy_file) [WINDOWS_NT]: Ensure file is not
+ read-only when setting modified time.
+
2002-03-08 Gerd Moellmann <[email protected]>
* xdisp.c (move_it_vertically_backward): At the end of the
diff --git a/src/fileio.c b/src/fileio.c
index d328a2d363..bb39f2a153 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -2409,12 +2409,25 @@ A prefix arg makes KEEP-TIME non-nil. */)
else if (NILP (keep_time))
{
EMACS_TIME now;
+ DWORD attributes;
+ char * filename;
+
EMACS_GET_TIME (now);
- if (set_file_times (XSTRING (encoded_newname)->data,
- now, now))
- Fsignal (Qfile_date_error,
- Fcons (build_string ("Cannot set file date"),
- Fcons (newname, Qnil)));
+ filename = XSTRING (encoded_newname)->data;
+
+ /* Ensure file is writable while its modified time is set. */
+ attributes = GetFileAttributes (filename);
+ SetFileAttributes (filename, attributes ^ FILE_ATTRIBUTE_READONLY);
+ if (set_file_times (filename, now, now))
+ {
+ /* Restore original attributes. */
+ SetFileAttributes (filename, attributes);
+ Fsignal (Qfile_date_error,
+ Fcons (build_string ("Cannot set file date"),
+ Fcons (newname, Qnil)));
+ }
+ /* Restore original attributes. */
+ SetFileAttributes (filename, attributes);
}
#else /* not WINDOWSNT */
ifd = emacs_open (XSTRING (encoded_file)->data, O_RDONLY, 0);