Cleanup the interface for creating soft or hard links.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 11 Mar 2014 18:40:24 +0000 (18:40 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 11 Mar 2014 18:40:24 +0000 (18:40 +0000)
Before this patch the unix code for creating hardlinks was unused. The code
for creating symbolic links was implemented in lib/Support/LockFileManager.cpp
and the code for creating hard links in lib/Support/*/Path.inc.

The only use we have for these is in LockFileManager.cpp and it can use both
soft and hard links. Just have a create_link function that creates one or the
other depending on the platform.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203596 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/FileSystem.h
lib/Support/LockFileManager.cpp
lib/Support/Unix/Path.inc
lib/Support/Windows/Path.inc
unittests/Support/Path.cpp

index 1812d24ead723f24de733c66a46287816bd3de18..906f37f7c189ea830262a35c9cdce017fa26aa29 100644 (file)
@@ -285,13 +285,18 @@ error_code create_directories(const Twine &path, bool IgnoreExisting = true);
 ///          error if the directory already existed.
 error_code create_directory(const Twine &path, bool IgnoreExisting = true);
 
-/// @brief Create a hard link from \a from to \a to.
+/// @brief Create a link from \a from to \a to.
+///
+/// The link may be a soft or a hard link, depending on the platform. The caller
+/// may not assume which one. Currently on windows it creates a hard link since
+/// soft links require extra privileges. On unix, it creates a soft link since
+/// hard links don't work on SMB file systems.
 ///
 /// @param to The path to hard link to.
 /// @param from The path to hard link from. This is created.
-/// @returns errc::success if exists(to) && exists(from) && equivalent(to, from)
-///          , otherwise a platform specific error_code.
-error_code create_hard_link(const Twine &to, const Twine &from);
+/// @returns errc::success if the link was created, otherwise a platform
+/// specific error_code.
+error_code create_link(const Twine &to, const Twine &from);
 
 /// @brief Get the current path.
 ///
index b45fcbca2e23e4466884bdae67f9ef3f2b72e5ab..ba1047b88ac2ee6516859aa1306535ea334f18c5 100644 (file)
@@ -67,22 +67,6 @@ bool LockFileManager::processStillExecuting(StringRef Hostname, int PID) {
   return true;
 }
 
-#if LLVM_ON_UNIX
-static error_code unix_create_symbolic_link(const Twine &to,
-                                            const Twine &from) {
-  // Get arguments.
-  SmallString<128> from_storage;
-  SmallString<128> to_storage;
-  StringRef f = from.toNullTerminatedStringRef(from_storage);
-  StringRef t = to.toNullTerminatedStringRef(to_storage);
-
-  if (::symlink(t.begin(), f.begin()) == -1)
-    return error_code(errno, system_category());
-
-  return error_code::success();
-}
-#endif
-
 LockFileManager::LockFileManager(StringRef FileName)
 {
   this->FileName = FileName;
@@ -132,20 +116,9 @@ LockFileManager::LockFileManager(StringRef FileName)
   }
 
   while (1) {
-#if LLVM_ON_UNIX
-    // Create a symbolic link from the lock file name. If this succeeds, we're
-    // done. Note that we are using symbolic link because hard links are not
-    // supported by all filesystems.
-    error_code EC
-      = unix_create_symbolic_link(UniqueLockFileName.str(),
-                                        LockFileName.str());
-#else
-    // We can't use symbolic links for windows.
-    // Create a hard link from the lock file name. If this succeeds, we're done.
-    error_code EC
-      = sys::fs::create_hard_link(UniqueLockFileName.str(),
-                                        LockFileName.str());
-#endif
+    // Create a link from the lock file name. If this succeeds, we're done.
+    error_code EC =
+        sys::fs::create_link(UniqueLockFileName.str(), LockFileName.str());
     if (EC == errc::success)
       return;
 
index caa30c7533a27717e07c522eae3c3585e1319a50..2b29baca7387d6d87fcb61d2676b6560210fadf1 100644 (file)
@@ -272,14 +272,16 @@ error_code create_directory(const Twine &path, bool IgnoreExisting) {
   return error_code::success();
 }
 
-error_code create_hard_link(const Twine &to, const Twine &from) {
+// Note that we are using symbolic link because hard links are not supported by
+// all filesystems (SMB doesn't).
+error_code create_link(const Twine &to, const Twine &from) {
   // Get arguments.
   SmallString<128> from_storage;
   SmallString<128> to_storage;
   StringRef f = from.toNullTerminatedStringRef(from_storage);
   StringRef t = to.toNullTerminatedStringRef(to_storage);
 
-  if (::link(t.begin(), f.begin()) == -1)
+  if (::symlink(t.begin(), f.begin()) == -1)
     return error_code(errno, system_category());
 
   return error_code::success();
index c39600357be3a7a898016a68024462d7db331af4..a555f3e794e5fe6ee1fb41bd344de7d7e2655cad 100644 (file)
@@ -158,7 +158,8 @@ error_code create_directory(const Twine &path, bool IgnoreExisting) {
   return error_code::success();
 }
 
-error_code create_hard_link(const Twine &to, const Twine &from) {
+// We can't use symbolic links for windows.
+error_code create_link(const Twine &to, const Twine &from) {
   // Get arguments.
   SmallString<128> from_storage;
   SmallString<128> to_storage;
index d5bee7ae5d86acd8b407ba0805741ff12198ca6e..91e421d38271ef8f2633713c22fdd653f0eff3b6 100644 (file)
@@ -299,7 +299,7 @@ TEST_F(FileSystemTest, Unique) {
 
   // Two paths representing the same file on disk should still provide the
   // same unique id.  We can test this by making a hard link.
-  ASSERT_NO_ERROR(fs::create_hard_link(Twine(TempPath), Twine(TempPath2)));
+  ASSERT_NO_ERROR(fs::create_link(Twine(TempPath), Twine(TempPath2)));
   fs::UniqueID D2;
   ASSERT_NO_ERROR(fs::getUniqueID(Twine(TempPath2), D2));
   ASSERT_EQ(D2, F1);
@@ -365,7 +365,7 @@ TEST_F(FileSystemTest, TempFiles) {
   ASSERT_FALSE(TempPath3.endswith("."));
 
   // Create a hard link to Temp1.
-  ASSERT_NO_ERROR(fs::create_hard_link(Twine(TempPath), Twine(TempPath2)));
+  ASSERT_NO_ERROR(fs::create_link(Twine(TempPath), Twine(TempPath2)));
   bool equal;
   ASSERT_NO_ERROR(fs::equivalent(Twine(TempPath), Twine(TempPath2), equal));
   EXPECT_TRUE(equal);