[Box Backup-commit] COMMIT r3521 - in box/trunk: lib/win32 test/bbackupd

subversion at boxbackup.org subversion at boxbackup.org
Sun Jan 4 19:41:50 GMT 2015


Author: chris
Date: 2015-01-04 19:41:50 +0000 (Sun, 04 Jan 2015)
New Revision: 3521

Modified:
   box/trunk/lib/win32/emu.cpp
   box/trunk/lib/win32/emu.h
   box/trunk/test/bbackupd/testbbackupd.cpp
Log:
Add test for hardlink handling.

Modified: box/trunk/lib/win32/emu.cpp
===================================================================
--- box/trunk/lib/win32/emu.cpp	2015-01-04 19:41:46 UTC (rev 3520)
+++ box/trunk/lib/win32/emu.cpp	2015-01-04 19:41:50 UTC (rev 3521)
@@ -1667,6 +1667,73 @@
 	return 0;
 }
 
+int emu_link(const char* pOldPath, const char* pNewPath)
+{
+	std::string AbsOldPathWithUnicode = 
+		ConvertPathToAbsoluteUnicode(pOldPath);
+
+	if (AbsOldPathWithUnicode.size() == 0)
+	{
+		// error already logged by ConvertPathToAbsoluteUnicode()
+		return -1;
+	}
+
+	std::string AbsNewPathWithUnicode = 
+		ConvertPathToAbsoluteUnicode(pNewPath);
+
+	if (AbsNewPathWithUnicode.size() == 0)
+	{
+		// error already logged by ConvertPathToAbsoluteUnicode()
+		return -1;
+	}
+
+	WCHAR* pOldBuffer = ConvertUtf8ToWideString(AbsOldPathWithUnicode.c_str());
+	if (!pOldBuffer)
+	{
+		return -1;
+	}
+
+	WCHAR* pNewBuffer = ConvertUtf8ToWideString(AbsNewPathWithUnicode.c_str());
+	if (!pNewBuffer)
+	{
+		delete [] pOldBuffer;
+		return -1;
+	}
+
+	BOOL result = CreateHardLinkW(pNewBuffer, pOldBuffer, NULL);
+	DWORD err = GetLastError();
+	delete [] pOldBuffer;
+	delete [] pNewBuffer;
+
+	if (!result)
+	{
+		if (err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND)
+		{
+			errno = ENOENT;
+		}
+		else if (err == ERROR_SHARING_VIOLATION)
+		{
+			errno = EBUSY;
+		}
+		else if (err == ERROR_ACCESS_DENIED)
+		{
+			errno = EACCES;
+		}
+		else
+		{
+			::syslog(LOG_WARNING, "Failed to hardlink file "
+				"'%s' to '%s': %s", pOldPath, pNewPath,
+				GetErrorMessage(err).c_str());
+			errno = ENOSYS;
+		}
+
+		return -1;
+	}
+
+	return 0;
+
+}
+
 int emu_unlink(const char* pFileName)
 {
 	std::string AbsPathWithUnicode = 
@@ -1709,6 +1776,7 @@
 				GetErrorMessage(err).c_str());
 			errno = ENOSYS;
 		}
+
 		return -1;
 	}
 

Modified: box/trunk/lib/win32/emu.h
===================================================================
--- box/trunk/lib/win32/emu.h	2015-01-04 19:41:46 UTC (rev 3520)
+++ box/trunk/lib/win32/emu.h	2015-01-04 19:41:50 UTC (rev 3521)
@@ -353,6 +353,7 @@
 
 int   emu_chdir  (const char* pDirName);
 int   emu_mkdir  (const char* pPathName);
+int   emu_link   (const char* pOldPath, const char* pNewPath);
 int   emu_unlink (const char* pFileName);
 int   emu_fstat  (HANDLE file,       struct emu_stat* st);
 int   emu_stat   (const char* pName, struct emu_stat* st);
@@ -363,6 +364,7 @@
 
 #define chdir(directory)         emu_chdir  (directory)
 #define mkdir(path,     mode)    emu_mkdir  (path)
+#define link(oldpath,   newpath) emu_link   (oldpath, newpath)
 #define unlink(file)             emu_unlink (file)
 #define utimes(buffer,  times)   emu_utimes (buffer,   times)
 #define chmod(file,     mode)    emu_chmod  (file,     mode)

Modified: box/trunk/test/bbackupd/testbbackupd.cpp
===================================================================
--- box/trunk/test/bbackupd/testbbackupd.cpp	2015-01-04 19:41:46 UTC (rev 3520)
+++ box/trunk/test/bbackupd/testbbackupd.cpp	2015-01-04 19:41:50 UTC (rev 3521)
@@ -1742,6 +1742,39 @@
 	TEARDOWN();
 }
 
+bool test_backup_hardlinked_files()
+{
+	SETUP_WITH_BBSTORED();
+
+	bbackupd.RunSyncNow();
+	TEST_COMPARE(Compare_Same);
+
+	// Create some hard links. First in the same directory:
+	TEST_THAT(link("testfiles/TestDir1/x1/dsfdsfs98.fd",
+		"testfiles/TestDir1/x1/hardlink1") == 0);
+	bbackupd.RunSyncNow();
+	TEST_COMPARE(Compare_Same);
+
+	// Now in a different directory
+	TEST_THAT(mkdir("testfiles/TestDir1/x2", 0755) == 0);
+	TEST_THAT(link("testfiles/TestDir1/x1/dsfdsfs98.fd",
+		"testfiles/TestDir1/x2/hardlink2") == 0);
+	bbackupd.RunSyncNow();
+	TEST_COMPARE(Compare_Same);
+
+	// Now delete one of them
+	TEST_THAT(unlink("testfiles/TestDir1/x1/dsfdsfs98.fd") == 0);
+	bbackupd.RunSyncNow();
+	TEST_COMPARE(Compare_Same);
+
+	// And another.
+	TEST_THAT(unlink("testfiles/TestDir1/x1/hardlink1") == 0);
+	bbackupd.RunSyncNow();
+	TEST_COMPARE(Compare_Same);
+
+	TEARDOWN();
+}
+
 bool test_backup_pauses_when_store_is_full()
 {
 	SETUP_WITHOUT_FILES();
@@ -4202,6 +4235,7 @@
 	// TEST_THAT(test_replace_zero_byte_file_with_nonzero_byte_file());
 	TEST_THAT(test_backup_disappearing_directory());
 	TEST_THAT(test_ssl_keepalives());
+	TEST_THAT(test_backup_hardlinked_files());
 	TEST_THAT(test_backup_pauses_when_store_is_full());
 	TEST_THAT(test_bbackupd_exclusions());
 	TEST_THAT(test_bbackupd_uploads_files());




More information about the Boxbackup-commit mailing list