[Box Backup-dev] COMMIT r545 - box/chris/general/lib/win32

boxbackup-dev at fluffy.co.uk boxbackup-dev at fluffy.co.uk
Sun Mar 12 23:50:10 GMT 2006


Author: chris
Date: 2006-03-12 23:50:07 +0000 (Sun, 12 Mar 2006)
New Revision: 545

Modified:
   box/chris/general/lib/win32/emu.cpp
Log:
* emu.cpp
- Open files with READ_CONTROL to give us access to the ACLs
- Force file size to zero for directories, since GetFileSizeEx returns
  random results (sometimes a multiple of 4096 bytes, sometimes 0)


Modified: box/chris/general/lib/win32/emu.cpp
===================================================================
--- box/chris/general/lib/win32/emu.cpp	2006-03-12 23:04:47 UTC (rev 544)
+++ box/chris/general/lib/win32/emu.cpp	2006-03-12 23:50:07 UTC (rev 545)
@@ -555,8 +555,6 @@
 // --------------------------------------------------------------------------
 int emu_fstat(HANDLE hdir, struct stat * st)
 {
-	ULARGE_INTEGER conv;
-
 	if (hdir == INVALID_HANDLE_VALUE)
 	{
 		::syslog(LOG_ERR, "Error: invalid file handle in emu_fstat()");
@@ -584,6 +582,7 @@
 	memset(st, 0, sizeof(*st));
 
 	// This next example is how we get our INODE (equivalent) information
+	ULARGE_INTEGER conv;
 	conv.HighPart = fi.nFileIndexHigh;
 	conv.LowPart = fi.nFileIndexLow;
 	st->st_ino = (_ino_t)conv.QuadPart;
@@ -593,20 +592,29 @@
 	st->st_atime = ConvertFileTimeToTime_t(&fi.ftLastAccessTime);
 	st->st_mtime = ConvertFileTimeToTime_t(&fi.ftLastWriteTime);
 
-	// size of the file
-	LARGE_INTEGER st_size;
-	if (!GetFileSizeEx(hdir, &st_size))
+	if (fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
 	{
-		::syslog(LOG_WARNING, "Failed to get file size: error %d",
-			GetLastError());
-		errno = EACCES;
-		return -1;
+		st->st_size = 0;
 	}
+	else
+	{
+		// size of the file
+		LARGE_INTEGER st_size;
+		memset(&st_size, 0, sizeof(st_size));
 
-	conv.HighPart = st_size.HighPart;
-	conv.LowPart = st_size.LowPart;
-	st->st_size = (_off_t)conv.QuadPart;
+		if (!GetFileSizeEx(hdir, &st_size))
+		{
+			::syslog(LOG_WARNING, "Failed to get file size: "
+				"error %d", GetLastError());
+			errno = EACCES;
+			return -1;
+		}
 
+		conv.HighPart = st_size.HighPart;
+		conv.LowPart = st_size.LowPart;
+		st->st_size = (_off_t)conv.QuadPart;
+	}
+
 	// at the mo
 	st->st_uid = 0;
 	st->st_gid = 0;
@@ -668,7 +676,8 @@
 	}
 
 	HANDLE handle = CreateFileW(pBuffer, 
-		FILE_READ_ATTRIBUTES | FILE_LIST_DIRECTORY | FILE_READ_EA, 
+		FILE_READ_ATTRIBUTES | FILE_LIST_DIRECTORY | FILE_READ_EA |
+		READ_CONTROL, 
 		FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE, 
 		NULL, 
 		OPEN_EXISTING, 
@@ -682,7 +691,7 @@
 		// at least one process must have the file open - 
 		// in this case someone else does.
 		handle = CreateFileW(pBuffer, 
-			0, 
+			READ_CONTROL, 
 			FILE_SHARE_READ, 
 			NULL, 
 			OPEN_EXISTING, 




More information about the Boxbackup-dev mailing list