summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/llvm-ar/Archive.h9
-rw-r--r--tools/llvm-ar/llvm-ar.cpp14
2 files changed, 10 insertions, 13 deletions
diff --git a/tools/llvm-ar/Archive.h b/tools/llvm-ar/Archive.h
index 79933ef1b8..2357b13d63 100644
--- a/tools/llvm-ar/Archive.h
+++ b/tools/llvm-ar/Archive.h
@@ -137,15 +137,6 @@ class ArchiveMember : public ilist_node<ArchiveMember> {
/// @brief Determine if the member has a long file name
bool hasLongFilename() const { return flags&HasLongFilenameFlag; }
- /// This method returns the status info (like Unix stat(2)) for the archive
- /// member. The status info provides the file's size, permissions, and
- /// modification time. The contents of the Path::StatusInfo structure, other
- /// than the size and modification time, may not have utility on non-Unix
- /// systems.
- /// @returns the status info for the archive member
- /// @brief Obtain the status info for the archive member
- const sys::FileStatus &getFileStatus() const { return info; }
-
/// This method causes the archive member to be replaced with the contents
/// of the file specified by \p File. The contents of \p this will be
/// updated to reflect the new data from \p File. The \p File must exist and
diff --git a/tools/llvm-ar/llvm-ar.cpp b/tools/llvm-ar/llvm-ar.cpp
index 4061551411..03bb36b116 100644
--- a/tools/llvm-ar/llvm-ar.cpp
+++ b/tools/llvm-ar/llvm-ar.cpp
@@ -440,12 +440,18 @@ doExtract(std::string* ErrMsg) {
file.write(data,len);
file.close();
+ sys::PathWithStatus PWS(I->getPath());
+ sys::FileStatus Status = *PWS.getFileStatus();
+
+ // Retain the original mode.
+ Status.mode = I->getMode();
+
// If we're supposed to retain the original modification times, etc. do so
// now.
- if (OriginalDates) {
- sys::PathWithStatus PWS(I->getPath());
- PWS.setStatusInfoOnDisk(I->getFileStatus());
- }
+ if (OriginalDates)
+ Status.modTime = I->getModTime();
+
+ PWS.setStatusInfoOnDisk(Status);
}
}
return false;