[llvm] r184464 - Add a setLastModificationAndAccessTime to PathV2.

Rafael Espindola rafael.espindola at gmail.com
Thu Jun 20 13:56:14 PDT 2013


Author: rafael
Date: Thu Jun 20 15:56:14 2013
New Revision: 184464

URL: http://llvm.org/viewvc/llvm-project?rev=184464&view=rev
Log:
Add a setLastModificationAndAccessTime to PathV2.

With this we can remove the last use of PathV1 from llvm-ar.cpp.

Modified:
    llvm/trunk/include/llvm/Support/FileSystem.h
    llvm/trunk/lib/Support/Unix/PathV2.inc
    llvm/trunk/lib/Support/Windows/PathV2.inc
    llvm/trunk/tools/llvm-ar/llvm-ar.cpp

Modified: llvm/trunk/include/llvm/Support/FileSystem.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/FileSystem.h?rev=184464&r1=184463&r2=184464&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/FileSystem.h (original)
+++ llvm/trunk/include/llvm/Support/FileSystem.h Thu Jun 20 15:56:14 2013
@@ -482,6 +482,8 @@ error_code status(const Twine &path, fil
 ///          platform specific error_code.
 error_code permissions(const Twine &path, perms prms);
 
+error_code setLastModificationAndAccessTime(int FD, TimeValue Time);
+
 /// @brief Is status available?
 ///
 /// @param s Input file status.

Modified: llvm/trunk/lib/Support/Unix/PathV2.inc
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/PathV2.inc?rev=184464&r1=184463&r2=184464&view=diff
==============================================================================
--- llvm/trunk/lib/Support/Unix/PathV2.inc (original)
+++ llvm/trunk/lib/Support/Unix/PathV2.inc Thu Jun 20 15:56:14 2013
@@ -441,6 +441,16 @@ error_code permissions(const Twine &path
   return error_code::success();
 }
 
+error_code setLastModificationAndAccessTime(int FD, TimeValue Time) {
+  timeval Times[2];
+  Times[0].tv_sec = Time.toPosixTime();
+  Times[0].tv_usec = 0;
+  Times[1] = Times[0];
+  if (::futimes(FD, Times))
+    return error_code(errno, system_category());
+  return error_code::success();
+}
+
 // Since this is most often used for temporary files, mode defaults to 0600.
 error_code unique_file(const Twine &model, int &result_fd,
                        SmallVectorImpl<char> &result_path,

Modified: llvm/trunk/lib/Support/Windows/PathV2.inc
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/PathV2.inc?rev=184464&r1=184463&r2=184464&view=diff
==============================================================================
--- llvm/trunk/lib/Support/Windows/PathV2.inc (original)
+++ llvm/trunk/lib/Support/Windows/PathV2.inc Thu Jun 20 15:56:14 2013
@@ -585,6 +585,17 @@ error_code permissions(const Twine &path
   return error_code::success();
 }
 
+error_code setLastModificationAndAccessTime(int FD, TimeValue Time) {
+  ULARGE_INTEGER UI;
+  UI.QuadPart = Time.toWin32Time();
+  FILETIME FT;
+  FT.dwLowDateTime = UI.LowPart;
+  FT.dwHighDateTime = UI.HighPart;
+  HANDLE FileHandle = reinterpret_cast<HANDLE>(_get_osfhandle(FD));
+  if (!SetFileTime(FileHandle, NULL, &FT, &FT))
+    return windows_error(::GetLastError());
+  return error_code::success();
+}
 
 // FIXME: mode should be used here and default to user r/w only,
 // it currently comes in as a UNIX mode.

Modified: llvm/trunk/tools/llvm-ar/llvm-ar.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/llvm-ar.cpp?rev=184464&r1=184463&r2=184464&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-ar/llvm-ar.cpp (original)
+++ llvm/trunk/tools/llvm-ar/llvm-ar.cpp Thu Jun 20 15:56:14 2013
@@ -19,13 +19,20 @@
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/Format.h"
 #include "llvm/Support/ManagedStatic.h"
-#include "llvm/Support/PathV1.h"
 #include "llvm/Support/PrettyStackTrace.h"
 #include "llvm/Support/Signals.h"
 #include "llvm/Support/raw_ostream.h"
 #include <algorithm>
 #include <cstdlib>
+#include <fcntl.h>
 #include <memory>
+
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+#include <unistd.h>
+#else
+#include <io.h>
+#endif
+
 using namespace llvm;
 
 // Option for compatibility with AIX, not used but must allow it to be present.
@@ -399,32 +406,41 @@ doExtract(std::string* ErrMsg) {
         (std::find(Paths.begin(), Paths.end(), I->getPath()) != Paths.end())) {
 
       // Open up a file stream for writing
-      std::string Err;
-      raw_fd_ostream file(I->getPath().str().c_str(), Err,
-                          raw_fd_ostream::F_Binary);
-      if (!Err.empty())
-        fail(Err);
-
-      // Get the data and its length
-      const char* data = reinterpret_cast<const char*>(I->getData());
-      unsigned len = I->getSize();
-
-      // Write the data.
-      file.write(data,len);
-      file.close();
+      int OpenFlags = O_TRUNC | O_WRONLY | O_CREAT;
+#ifdef O_BINARY
+      OpenFlags |= O_BINARY;
+#endif
+
+      int FD = open(I->getPath().str().c_str(), OpenFlags, 0664);
+      if (FD < 0)
+        return true;
+
+      {
+        raw_fd_ostream file(FD, false);
+
+        // Get the data and its length
+        const char* data = reinterpret_cast<const char*>(I->getData());
+        unsigned len = I->getSize();
 
-      sys::PathWithStatus PWS(I->getPath());
-      sys::FileStatus Status = *PWS.getFileStatus();
+        // Write the data.
+        file.write(data, len);
+      }
 
       // Retain the original mode.
-      Status.mode = I->getMode();
+      sys::fs::perms Mode = sys::fs::perms(I->getMode());
+      error_code EC = sys::fs::permissions(I->getPath(), Mode);
+      if (EC)
+        fail(EC.message());
 
       // If we're supposed to retain the original modification times, etc. do so
       // now.
-      if (OriginalDates)
-        Status.modTime = I->getModTime();
-
-      PWS.setStatusInfoOnDisk(Status);
+      if (OriginalDates) {
+        EC = sys::fs::setLastModificationAndAccessTime(FD, I->getModTime());
+        if (EC)
+          fail(EC.message());
+      }
+      if (close(FD))
+        return true;
     }
   }
   return false;





More information about the llvm-commits mailing list