From e6d598eee08b02448395139276fd0b24be2cf692 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Mon, 4 Apr 2005 10:26:35 +0000 Subject: * dcrt0.cc (dll_crt0_1): Don't call set_cygwin_privileges on 9x. * fhandler.h (enum change_state): Add. (fhandler_base::status): Add a bit to has_changed flag. (fhandler_base::has_changed): Implement with type change_state. * fhandler.cc (fhandler_base::raw_write): Accomodate type change of has_changed. * fhandler_disk_file.cc )fhandler_disk_file::touch_ctime): Also touch modification time if has_changed == data_changed. (fhandler_disk_file::fchmod): Also open on 9x, otherwise we can't touch ctime. Accomodate type change of has_changed. (fhandler_disk_file::fchown): Accomodate type change of has_changed. (fhandler_disk_file::facl): Ditto. (fhandler_disk_file::ftruncate): Ditto. (fhandler_disk_file::link): Ditto. (fhandler_base::open_fs): Ditto. --- winsup/cygwin/fhandler_disk_file.cc | 38 ++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) (limited to 'winsup/cygwin/fhandler_disk_file.cc') diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index 8f52425fc..0cf1e1fb0 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -391,10 +391,13 @@ fhandler_disk_file::touch_ctime (void) FILETIME ft; GetSystemTimeAsFileTime (&ft); - if (!SetFileTime (get_io_handle (), &ft, NULL, NULL)) + /* Modification time is touched if the file data has changed as well. + This happens for instance on write() or ftruncate(). */ + if (!SetFileTime (get_io_handle (), &ft, NULL, + has_changed () == data_changed ? &ft : NULL)) debug_printf ("SetFileTime (%s) failed, %E", get_win32_name ()); else - has_changed (false); + has_changed (no_change); } int __stdcall @@ -407,15 +410,16 @@ fhandler_disk_file::fchmod (mode_t mode) if (pc.is_fs_special ()) return chmod_device (pc, mode); - if (wincap.has_security ()) + /* Also open on 9x, otherwise we can't touch ctime. */ + if (!get_io_handle ()) { - if (!get_io_handle () && pc.has_acls ()) - { - query_open (query_write_control); - if (!(oret = open (O_BINARY, 0))) - return -1; - } + query_open (query_write_control); + if (!(oret = open (O_BINARY, 0))) + return -1; + } + if (wincap.has_security ()) + { if (!allow_ntsec && allow_ntea) /* Not necessary when manipulating SD. */ SetFileAttributes (pc, (DWORD) pc & ~FILE_ATTRIBUTE_READONLY); if (pc.isdir ()) @@ -440,7 +444,7 @@ fhandler_disk_file::fchmod (mode_t mode) /* Set ctime on success. */ if (!res) - has_changed (true); + has_changed (inode_changed); if (oret) close (); @@ -477,7 +481,7 @@ fhandler_disk_file::fchown (__uid32_t uid, __gid32_t gid) uid, gid, attrib); /* Set ctime on success. */ if (!res) - has_changed (true); + has_changed (inode_changed); } if (oret) @@ -574,7 +578,7 @@ fhandler_disk_file::facl (int cmd, int nentries, __aclent32_t *aclbufp) /* Set ctime on success. */ if (!res && cmd == SETACL) - has_changed (true); + has_changed (inode_changed); if (oret) close (); @@ -624,7 +628,7 @@ fhandler_disk_file::ftruncate (_off64_t length) lseek (prev_loc, SEEK_SET); /* Set ctime on success. */ if (!res) - has_changed (true); + has_changed (data_changed); } } return res; @@ -757,7 +761,7 @@ fhandler_disk_file::link (const char *newpath) success: /* Set ctime on success. */ - has_changed (true); + has_changed (inode_changed); close (); if (!allow_winsymlinks && pc.is_lnk_symlink ()) SetFileAttributes (newpc, (DWORD) pc @@ -773,13 +777,13 @@ docopy: return -1; } /* Set ctime on success, also on the copy. */ - has_changed (true); + has_changed (inode_changed); close (); fhandler_disk_file fh (newpc); fh.query_open (query_write_attributes); if (fh.open (O_BINARY, 0)) { - fh.has_changed (true); + fh.has_changed (inode_changed); fh.close (); } return 0; @@ -895,7 +899,7 @@ fhandler_base::open_fs (int flags, mode_t mode) /* O_TRUNC on existing file requires setting ctime. */ if ((flags & (O_CREAT | O_TRUNC)) == O_TRUNC) - has_changed (true); + has_changed (data_changed); set_fs_flags (pc.fs_flags ()); -- cgit v1.2.3