diff --git a/llvm/include/llvm/Support/FileSystem.h b/llvm/include/llvm/Support/FileSystem.h index b660a5b16183..474e01ce360f 100644 --- a/llvm/include/llvm/Support/FileSystem.h +++ b/llvm/include/llvm/Support/FileSystem.h @@ -153,6 +153,8 @@ class file_status dev_t fs_st_dev; ino_t fs_st_ino; time_t fs_st_mtime; + uid_t fs_st_uid; + gid_t fs_st_gid; #elif defined (LLVM_ON_WIN32) uint32_t LastWriteTimeHigh; uint32_t LastWriteTimeLow; @@ -177,6 +179,18 @@ public: perms permissions() const { return Perms; } TimeValue getLastModificationTime() const; + #if defined(LLVM_ON_UNIX) + uint32_t getUser() const { return fs_st_uid; } + uint32_t getGroup() const { return fs_st_gid; } + #elif defined (LLVM_ON_WIN32) + uint32_t getUser() const { + return 9999; // Not applicable to Windows, so... + } + uint32_t getGroup() const { + return 9999; // Not applicable to Windows, so... + } + #endif + // setters void type(file_type v) { Type = v; } void permissions(perms p) { Perms = p; } diff --git a/llvm/lib/Support/Unix/PathV2.inc b/llvm/lib/Support/Unix/PathV2.inc index 4c76f28c66c2..b036c74ad165 100644 --- a/llvm/lib/Support/Unix/PathV2.inc +++ b/llvm/lib/Support/Unix/PathV2.inc @@ -408,6 +408,8 @@ error_code status(const Twine &path, file_status &result) { result.fs_st_dev = status.st_dev; result.fs_st_ino = status.st_ino; result.fs_st_mtime = status.st_mtime; + result.fs_st_uid = status.st_uid; + result.fs_st_gid = status.st_gid; return error_code::success(); } diff --git a/llvm/tools/llvm-ar/Archive.cpp b/llvm/tools/llvm-ar/Archive.cpp index 520e410e1aca..8d21481b57bd 100644 --- a/llvm/tools/llvm-ar/Archive.cpp +++ b/llvm/tools/llvm-ar/Archive.cpp @@ -18,7 +18,6 @@ #include "llvm/IR/Module.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/PathV1.h" #include "llvm/Support/Process.h" #include "llvm/Support/system_error.h" #include @@ -109,15 +108,21 @@ bool ArchiveMember::replaceWith(StringRef newFile, std::string* ErrMsg) { if (!signature) { sys::fs::get_magic(path, magic.capacity(), magic); signature = magic.c_str(); - sys::PathWithStatus PWS(path); - const sys::FileStatus *FSinfo = PWS.getFileStatus(false, ErrMsg); - if (!FSinfo) + + sys::fs::file_status Status; + error_code EC = sys::fs::status(path, Status); + if (EC) + return true; + + User = Status.getUser(); + Group = Status.getGroup(); + Mode = Status.permissions(); + ModTime = Status.getLastModificationTime(); + + // FIXME: On posix this is a second stat. + EC = sys::fs::file_size(path, Size); + if (EC) return true; - User = FSinfo->getUser(); - Group = FSinfo->getGroup(); - Mode = FSinfo->getMode(); - ModTime = FSinfo->getTimestamp(); - Size = FSinfo->getSize(); } // Determine what kind of file it is.