From 27ff1f3f7d9a20e02e00fe88dbb7541ce066d33c Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 19 Jun 2013 19:17:15 +0000 Subject: Always set the mode. This matches GNU ar behavior. Also remove the now unused getFileStatus method. Not sure how to add a test, it would have to run ls -l or something like that. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184337 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/llvm-ar/Archive.h | 9 --------- tools/llvm-ar/llvm-ar.cpp | 14 ++++++++++---- 2 files changed, 10 insertions(+), 13 deletions(-) (limited to 'tools/llvm-ar') 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 { /// @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; -- cgit v1.2.3