diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2005-02-17 12:08:16 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2005-02-17 12:08:16 +0000 |
commit | b066a1951340daaa2c031551deb85e851766f287 (patch) | |
tree | 70fab35388abcdcca79c834670f4724481e72dbd /winsup/cygwin/times.cc | |
parent | f1d439fc641fb71c9cf1e32e6a06885f10dbabdc (diff) | |
download | newlib-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.cc | 27 |
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. */ |