This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

more ctime bugs


Corinna, since you've been fixing so many ctime bugs lately to match SUSv3 and POSIX, could you also fix open(2) when O_TRUNC is set, and write(2) and link(2) in general, to touch ctime?  I guess this all stems from the fact that the Microsoft documentation for Windows file systems calls out the 3 file times as "create, access, and write", with access updates occuring on read or write; while POSIX names the three times as "file status change, file data access, and file data modify", with access updates only required on read (but allowed on write as an implementation extension).  Status changes certainly happen more often than creation, so the meaning of ctime is drastically different depending on which word you substitute for 'c'!

I found the problem with link(2) from the coreutils testsuite, and the others by browsing this search on the POSIX docs: http://www.opengroup.org/cgi-bin/susv3search.pl?KEYWORDS=st_ctime+update&SUBSTRING=substring&CONTEXT=%28%2Ffunctions%2F%29

$ rm a b
$ touch a
$ stat a
  File: `a'
  Size: 0               Blocks: 0          IO Block: 1024   regular empty file
Device: 10292fb1h/271134641d    Inode: 17451448556181969  Links: 1
Access: (0666/-rw-rw-rw-)  Uid: (22382/  eblake)   Gid: (10513/Domain Users)
Access: 2005-02-09 12:15:49.179375000 -0700
Modify: 2005-02-09 12:15:49.179375000 -0700
Change: 2005-02-09 12:15:49.179375000 -0700
$ ln a b    # calls link(2)
$ echo a > a    # calls open(2) with O_TRUNC, and calls write(2)
$ stat a
  File: `a'
  Size: 2               Blocks: 1          IO Block: 1024   regular file
Device: 10292fb1h/271134641d    Inode: 17451448556181969  Links: 2
Access: (0666/-rw-rw-rw-)  Uid: (22382/  eblake)   Gid: (10513/Domain Users)
Access: 2005-02-09 12:15:55.804375000 -0700
Modify: 2005-02-09 12:15:55.804375000 -0700
Change: 2005-02-09 12:15:49.179375000 -0700
# Oops, ctime unchanged

It is also interesting to note that Microsoft documents that for FAT, mtime has a resolution of only 2 sec, but ctime has a resolution of 10 ms.  There are a lot of scripts out there that end up using `sleep 2' to ensure two files in FAT have different mtime stamps, since POSIX requires make(1) to use mtime and not ctime to determine when one file is older than another.  If ctime is consistently updated on writes, perhaps cygwin make could use ctime as a tiebreaker between two files with the same mtime to reduce the need for the sleep 2.

--
Eric Blake

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]