Implement FileSystem::GetPermissions for Windows. Differential Revision: http://revie...
authorAdrian McCarthy <amccarth@google.com>
Fri, 17 Jul 2015 20:23:03 +0000 (20:23 +0000)
committerAdrian McCarthy <amccarth@google.com>
Fri, 17 Jul 2015 20:23:03 +0000 (20:23 +0000)
llvm-svn: 242568

lldb/source/Host/windows/FileSystem.cpp

index 7e452bc..d0a5969 100644 (file)
@@ -10,6 +10,8 @@
 #include "lldb/Host/windows/windows.h"
 
 #include <shellapi.h>
+#include <sys/stat.h>
+#include <sys/types.h>
 
 #include "lldb/Host/FileSystem.h"
 #include "llvm/Support/FileSystem.h"
@@ -71,7 +73,23 @@ Error
 FileSystem::GetFilePermissions(const FileSpec &file_spec, uint32_t &file_permissions)
 {
     Error error;
-    error.SetErrorStringWithFormat("%s is not supported on this host", __PRETTY_FUNCTION__);
+    // Beware that Windows's permission model is different from Unix's, and it's
+    // not clear if this API is supposed to check ACLs.  To match the caller's
+    // expectations as closely as possible, we'll use Microsoft's _stat, which
+    // attempts to emulate POSIX stat.  This should be good enough for basic
+    // checks like FileSpec::Readable.
+    struct _stat file_stats;
+    if (::_stat(file_spec.GetCString(), &file_stats) == 0)
+    {
+        // The owner permission bits in "st_mode" currently match the definitions
+        // for the owner file mode bits.
+        file_permissions = file_stats.st_mode & (_S_IREAD | _S_IWRITE | _S_IEXEC);
+    }
+    else
+    {
+        error.SetErrorToErrno();
+    }
+
     return error;
 }