From eee2d2b035295a04a8e00c2f187cfa786bffcdc0 Mon Sep 17 00:00:00 2001
From: Andy Cedilnik <andy.cedilnik@kitware.com>
Date: Tue, 12 Jul 2005 13:21:21 -0400
Subject: BUG: Revert the change to FileIsDirectory. Add FileIsSymlink and
 treat symlinks as files when removing directory

---
 Source/kwsys/SystemTools.cxx    | 24 +++++++++++++++++++-----
 Source/kwsys/SystemTools.hxx.in |  5 +++++
 2 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx
index 157ea55..a9193bd 100644
--- a/Source/kwsys/SystemTools.cxx
+++ b/Source/kwsys/SystemTools.cxx
@@ -1827,7 +1827,8 @@ bool SystemTools::RemoveADirectory(const char* source)
       kwsys_stl::string fullPath = source;
       fullPath += "/";
       fullPath += dir.GetFile(static_cast<unsigned long>(fileNum));
-      if(SystemTools::FileIsDirectory(fullPath.c_str()))
+      if(SystemTools::FileIsDirectory(fullPath.c_str()) &&
+        !SystemTools::FileIsSymlink(fullPath.c_str()))
         {
         if (!SystemTools::RemoveADirectory(fullPath.c_str()))
           {
@@ -2044,11 +2045,7 @@ kwsys_stl::string SystemTools
 bool SystemTools::FileIsDirectory(const char* name)
 {  
   struct stat fs;
-#if _WIN32
   if(stat(name, &fs) == 0)
-#else
-  if(lstat(name, &fs) == 0)
-#endif
     {
 #if _WIN32
     return ((fs.st_mode & _S_IFDIR) != 0);
@@ -2062,6 +2059,23 @@ bool SystemTools::FileIsDirectory(const char* name)
     }
 }
 
+bool SystemTools::FileIsSymlink(const char* name)
+{  
+#if _WIN32
+  return false;
+#else
+  struct stat fs;
+  if(lstat(name, &fs) == 0)
+    {
+    return S_ISLNK(fs.st_mode);
+    }
+  else
+    {
+    return false;
+    }
+#endif
+}
+
 int SystemTools::ChangeDirectory(const char *dir)
 {
   return Chdir(dir);
diff --git a/Source/kwsys/SystemTools.hxx.in b/Source/kwsys/SystemTools.hxx.in
index 8f22165..8654a67 100644
--- a/Source/kwsys/SystemTools.hxx.in
+++ b/Source/kwsys/SystemTools.hxx.in
@@ -502,6 +502,11 @@ public:
   static bool FileIsDirectory(const char* name);
   
   /**
+   * Return true if the file is a symlink
+   */
+  static bool FileIsSymlink(const char* name);
+  
+  /**
    * return true if the file has a given signature (first set of bytes)
    */
   static bool FileHasSignature(
-- 
cgit v0.12