Provide Path::isSpecialFile interface for PR5568.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@89765 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/System/Unix/Path.inc b/lib/System/Unix/Path.inc
index 89285b4..d134aaa 100644
--- a/lib/System/Unix/Path.inc
+++ b/lib/System/Unix/Path.inc
@@ -335,7 +335,7 @@
   free(pv);
   return (NULL);
 }
-#endif
+#endif // __FreeBSD__
 
 /// GetMainExecutable - Return the path to the main executable, given the
 /// value of argv[0] from program startup.
@@ -454,6 +454,24 @@
 }
 
 bool
+Path::isSpecialFile() const {
+  // Get the status so we can determine if its a file or directory
+  struct stat buf;
+  std::string *ErrStr;
+
+  if (0 != stat(path.c_str(), &buf)) {
+    MakeErrMsg(ErrStr, path + ": can't get status of file");
+    return true;
+  }
+
+  if (S_ISDIR(buf.st_mode) || S_ISREG(buf.st_mode)) {
+    return false;
+  }
+
+  return true;
+}
+
+bool
 Path::canExecute() const {
   if (0 != access(path.c_str(), R_OK | X_OK ))
     return false;
@@ -723,7 +741,7 @@
 
 bool
 Path::eraseFromDisk(bool remove_contents, std::string *ErrStr) const {
-  // Get the status so we can determin if its a file or directory
+  // Get the status so we can determine if its a file or directory
   struct stat buf;
   if (0 != stat(path.c_str(), &buf)) {
     MakeErrMsg(ErrStr, path + ": can't get status of file");