OSDN Git Service

Fix a file overwrite bug in llvm-ar introduced by changes to
authorReid Spencer <rspencer@reidspencer.com>
Wed, 15 Dec 2004 08:32:45 +0000 (08:32 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Wed, 15 Dec 2004 08:32:45 +0000 (08:32 +0000)
createTemporaryFile semantics where it doesn't create a fully unique name
if the basename doesn't exist. This functionality is now optionally
provided by the boolean reuse_current parameter to createTemporaryFile and
makeUnique. The default values differ because of the way these functions
are used in LLVM.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18961 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/System/Path.h
lib/System/Unix/Path.cpp
lib/System/Unix/Path.inc
lib/System/Win32/Path.cpp
lib/System/Win32/Path.inc

index 0e757f5..5be47b2 100644 (file)
@@ -494,7 +494,7 @@ namespace sys {
       /// already unique. 
       /// @throws std::string if an unrecoverable error occurs.
       /// @brief Make the current path name unique in the file system.
-      void makeUnique();
+      void makeUnique( bool reuse_current = true );
 
       /// This method attempts to create a directory in the file system with the
       /// same name as the Path object. The \p create_parents parameter controls
@@ -529,7 +529,7 @@ namespace sys {
       /// the newly generated temporary file name is unique in the file system.
       /// @throws std::string if there is an error
       /// @brief Create a unique temporary file
-      bool createTemporaryFile();
+      bool createTemporaryFile(bool reuse_current = false);
 
       /// This method attempts to destroy the directory named by the last in 
       /// the Path name.  If \p remove_contents is false, an attempt will be 
index d4bf026..84c2d2d 100644 (file)
@@ -481,13 +481,13 @@ Path::createFile() {
 }
 
 bool
-Path::createTemporaryFile() {
+Path::createTemporaryFile(bool reuse_current) {
   // Make sure we're dealing with a file
   if (!isFile()) 
     return false;
 
   // Make this into a unique file name
-  makeUnique();
+  makeUnique( reuse_current );
 
   // create the file
   int outFile = ::open(path.c_str(), O_WRONLY|O_CREAT|O_TRUNC, 0666);
@@ -600,8 +600,8 @@ CopyFile(const sys::Path &Dest, const sys::Path &Src) {
 }
 
 void 
-Path::makeUnique() {
-  if (!exists())
+Path::makeUnique(bool reuse_current) {
+  if (reuse_current && !exists())
     return; // File doesn't exist already, just use it!
 
   // Append an XXXXXX pattern to the end of the file for use with mkstemp, 
index d4bf026..84c2d2d 100644 (file)
@@ -481,13 +481,13 @@ Path::createFile() {
 }
 
 bool
-Path::createTemporaryFile() {
+Path::createTemporaryFile(bool reuse_current) {
   // Make sure we're dealing with a file
   if (!isFile()) 
     return false;
 
   // Make this into a unique file name
-  makeUnique();
+  makeUnique( reuse_current );
 
   // create the file
   int outFile = ::open(path.c_str(), O_WRONLY|O_CREAT|O_TRUNC, 0666);
@@ -600,8 +600,8 @@ CopyFile(const sys::Path &Dest, const sys::Path &Src) {
 }
 
 void 
-Path::makeUnique() {
-  if (!exists())
+Path::makeUnique(bool reuse_current) {
+  if (reuse_current && !exists())
     return; // File doesn't exist already, just use it!
 
   // Append an XXXXXX pattern to the end of the file for use with mkstemp, 
index 24cfc46..21e07c8 100644 (file)
@@ -587,8 +587,8 @@ CopyFile(const sys::Path &Dest, const sys::Path &Src) {
 }
 
 void 
-Path::makeUnique() {
-  if (!exists())
+Path::makeUnique( bool reuse_current ) {
+  if (reuse_current && !exists())
     return; // File doesn't exist already, just use it!
 
   Path dir (*this);
@@ -602,6 +602,16 @@ Path::makeUnique() {
   path = newName;
 }
 
+bool
+Path::createTemporaryFile(bool reuse_current) {
+  // Make sure we're dealing with a file
+  if (!isFile()) 
+    return false;
+
+  // Make this into a unique file name
+  makeUnique( reuse_current );
+}
+
 }
 }
 
index 24cfc46..21e07c8 100644 (file)
@@ -587,8 +587,8 @@ CopyFile(const sys::Path &Dest, const sys::Path &Src) {
 }
 
 void 
-Path::makeUnique() {
-  if (!exists())
+Path::makeUnique( bool reuse_current ) {
+  if (reuse_current && !exists())
     return; // File doesn't exist already, just use it!
 
   Path dir (*this);
@@ -602,6 +602,16 @@ Path::makeUnique() {
   path = newName;
 }
 
+bool
+Path::createTemporaryFile(bool reuse_current) {
+  // Make sure we're dealing with a file
+  if (!isFile()) 
+    return false;
+
+  // Make this into a unique file name
+  makeUnique( reuse_current );
+}
+
 }
 }