From b066a1951340daaa2c031551deb85e851766f287 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Thu, 17 Feb 2005 12:08:16 +0000 Subject: [PATCH] * times.cc (utimes): Open files with FILE_WRITE_ATTRIBUTES first, if that fails, try opeing with GENERIC_WRITE. Fix comments. --- winsup/cygwin/ChangeLog | 5 +++++ winsup/cygwin/times.cc | 27 +++++++++++++-------------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 3fba75ed1..f04afaffc 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2005-02-17 Corinna Vinschen + + * times.cc (utimes): Open files with FILE_WRITE_ATTRIBUTES first, + if that fails, try opeing with GENERIC_WRITE. Fix comments. + 2005-02-15 Christopher Faylor * path.h (path_conv::issocket): Return true if device == FH_UNIX rather diff --git a/winsup/cygwin/times.cc b/winsup/cygwin/times.cc index e69501225..b76c0b6b2 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. */