diff --git a/SystemTools.cxx b/SystemTools.cxx index f9c2b354ee4e13f6caefb18b17dd5a7136f24fb5..0a923e8f2235fb45060184cb24ed7e405d47e80e 100644 --- a/SystemTools.cxx +++ b/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/SystemTools.hxx.in b/SystemTools.hxx.in index d7d9322afb212ddea0358c2dcf937597ec5efed7..6ca556c471db32b06dd6c32e656f6b57d05522be 100644 --- a/SystemTools.hxx.in +++ b/SystemTools.hxx.in @@ -501,6 +501,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) */