win32.c
changeset 4245 59697b49326e
parent 4236 1bc9b3024d0d
child 4247 00cdac3de8e9
--- a/win32.c	Wed Aug 09 21:11:45 2006 +0000
+++ b/win32.c	Thu Aug 10 09:10:41 2006 +0000
@@ -719,11 +719,18 @@
 
 bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb)
 {
+	// hectonanoseconds between Windows and POSIX epoch
+	static const int64 posix_epoch_hns = 0x019DB1DED53E8000;
 	const WIN32_FIND_DATA *fd = &ent->dir->fd;
 	if (fd->dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) return false;
 
 	sb->st_size  = ((uint64) fd->nFileSizeHigh << 32) + fd->nFileSizeLow;
-	sb->st_mtime = *(uint64*)&fd->ftLastWriteTime;
+	/* UTC FILETIME to seconds-since-1970 UTC
+	 * we just have to subtract POSIX epoch and scale down to units of seconds.
+	 * http://www.gamedev.net/community/forums/topic.asp?topic_id=294070&whichpage=1&#1860504
+	 * XXX - not entirely correct, since filetimes on FAT aren't UTC but local,
+	 * this won't entirely be correct, but we use the time only for comparsion. */
+	sb->st_mtime = (time_t)((*(uint64*)&fd->ftLastWriteTime - posix_epoch_hns) / 1E7);
 	sb->st_mode  = (fd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)? S_IFDIR : S_IFREG;
 
 	return true;