aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygwin/times.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2005-02-17 12:08:16 +0000
committerCorinna Vinschen <corinna@vinschen.de>2005-02-17 12:08:16 +0000
commitb066a1951340daaa2c031551deb85e851766f287 (patch)
tree70fab35388abcdcca79c834670f4724481e72dbd /winsup/cygwin/times.cc
parentf1d439fc641fb71c9cf1e32e6a06885f10dbabdc (diff)
downloadnewlib-b066a1951340daaa2c031551deb85e851766f287.zip
newlib-b066a1951340daaa2c031551deb85e851766f287.tar.gz
newlib-b066a1951340daaa2c031551deb85e851766f287.tar.bz2
* times.cc (utimes): Open files with FILE_WRITE_ATTRIBUTES first,
if that fails, try opeing with GENERIC_WRITE. Fix comments.
Diffstat (limited to 'winsup/cygwin/times.cc')
-rw-r--r--winsup/cygwin/times.cc27
1 files changed, 13 insertions, 14 deletions
diff --git a/winsup/cygwin/times.cc b/winsup/cygwin/times.cc
index e695012..b76c0b6 100644
--- a/winsup/cygwin/times.cc
+++ b/winsup/cygwin/times.cc
@@ -461,20 +461,22 @@ utimes (const char *path, const struct timeval *tvp)
/* MSDN suggests using FILE_FLAG_BACKUP_SEMANTICS for accessing
the times of directories. */
- /* Note: It's not documented in MSDN that FILE_WRITE_ATTRIBUTES is
- sufficient to change the timestamps, but it is for NTFS and FAT,
- local or remote, NT and 9x. Unfortunately it's not sufficient
- for a remote HPFS. Looking for a way to decide whether we
- should use FILE_WRITE_ATTRIBUTES or GENERIC_WRITE, we're now
- using the has_acls () attribute. The assumption is, that file
- systems not supporting ACLs don't have a way to distinguish
- between GENERIC_WRITE and FILE_WRITE_ATTRIBUTES anyway. */
- HANDLE h = CreateFile (win32, win32.has_acls () ? FILE_WRITE_ATTRIBUTES
- : GENERIC_WRITE,
+ /* Note: It's documented in MSDN that FILE_WRITE_ATTRIBUTES is
+ sufficient to change the timestamps. Unfortunately it's not
+ sufficient for a remote HPFS which requires GENERIC_WRITE.
+ Since we don't trust the weird FS name "??SS", we just try to
+ open with GENERIC_WRITE if opening with FILE_WRITE_ATTRIBUTES
+ failed. That should do it, though this fails for R/O files
+ of course. */
+ HANDLE h = CreateFile (win32, FILE_WRITE_ATTRIBUTES,
FILE_SHARE_READ | FILE_SHARE_WRITE,
&sec_none_nih, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS,
0);
+ if (h == INVALID_HANDLE_VALUE)
+ h = CreateFile (win32, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
+ &sec_none_nih, OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, 0);
if (h == INVALID_HANDLE_VALUE)
{
@@ -504,16 +506,13 @@ utimes (const char *path, const struct timeval *tvp)
timeval_to_filetime (tvp + 0, &lastaccess);
timeval_to_filetime (tvp + 1, &lastwrite);
- /* Mark st_ctime for update */
+ /* Update st_ctime */
timeval_to_filetime (tmp + 0, &lastchange);
debug_printf ("incoming lastaccess %08x %08x",
tvp->tv_sec,
tvp->tv_usec);
-// dump_filetime (lastaccess);
-// dump_filetime (lastwrite);
-
/* FIXME: SetFileTime needs a handle with a write lock
on the file whose time is being modified. So calls to utime()
fail for read only files. */