[Lldb-commits] [PATCH] D31079: Replace std::ofstream with llvm::raw_fd_ostream

Pavel Labath via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Fri Mar 17 07:35:10 PDT 2017


labath created this revision.

ofstream does not handle paths with non-ascii characters correctly on
windows, so I am switching these to llvm streams to fix that.

Ideally I'd like to replace the two occurences of ifstream as well, but
it's not clear to me what is the right replacement, as llvm interfaces
seem to be based around reading the full file, which seems wasteful, if
all I'm going to do is to stream it to a socket.


https://reviews.llvm.org/D31079

Files:
  source/Plugins/Platform/Android/AdbClient.cpp
  source/Target/Platform.cpp
  tools/lldb-server/lldb-platform.cpp


Index: tools/lldb-server/lldb-platform.cpp
===================================================================
--- tools/lldb-server/lldb-platform.cpp
+++ tools/lldb-server/lldb-platform.cpp
@@ -108,23 +108,25 @@
     return Error("Failed to create directory %s: %s",
                  temp_file_spec.GetCString(), error.AsCString());
 
-  llvm::SmallString<PATH_MAX> temp_file_path;
+  llvm::SmallString<64> temp_file_path;
   temp_file_spec.AppendPathComponent("port-file.%%%%%%");
-  auto err_code = llvm::sys::fs::createUniqueFile(temp_file_spec.GetCString(),
+  int FD;
+  auto err_code = llvm::sys::fs::createUniqueFile(temp_file_spec.GetPath(), FD,
                                                   temp_file_path);
   if (err_code)
     return Error("Failed to create temp file: %s", err_code.message().c_str());
 
-  llvm::FileRemover tmp_file_remover(temp_file_path.c_str());
+  llvm::FileRemover tmp_file_remover(temp_file_path);
 
   {
-    std::ofstream temp_file(temp_file_path.c_str(), std::ios::out);
-    if (!temp_file.is_open())
-      return Error("Failed to open temp file %s", temp_file_path.c_str());
+    llvm::raw_fd_ostream temp_file(FD, true);
     temp_file << socket_id;
+    temp_file.close();
+    if (temp_file.has_error())
+      return Error("Failed to write to port file.");
   }
 
-  err_code = llvm::sys::fs::rename(temp_file_path.c_str(), file_spec.GetPath());
+  err_code = llvm::sys::fs::rename(temp_file_path, file_spec.GetPath());
   if (err_code)
     return Error("Failed to rename file %s to %s: %s", temp_file_path.c_str(),
                  file_spec.GetPath().c_str(), err_code.message().c_str());
Index: source/Target/Platform.cpp
===================================================================
--- source/Target/Platform.cpp
+++ source/Target/Platform.cpp
@@ -1641,8 +1641,9 @@
                                     const FileSpec &dst_file_spec) {
   Error error;
 
-  std::ofstream dst(dst_file_spec.GetPath(), std::ios::out | std::ios::binary);
-  if (!dst.is_open()) {
+  std::error_code EC;
+  llvm::raw_fd_ostream dst(dst_file_spec.GetPath(), EC, llvm::sys::fs::F_None);
+  if (EC) {
     error.SetErrorStringWithFormat("unable to open destination file: %s",
                                    dst_file_spec.GetPath().c_str());
     return error;
Index: source/Plugins/Platform/Android/AdbClient.cpp
===================================================================
--- source/Plugins/Platform/Android/AdbClient.cpp
+++ source/Plugins/Platform/Android/AdbClient.cpp
@@ -402,13 +402,14 @@
     return error;
 
   const auto output_filename = output_file_spec.GetPath();
-  std::ofstream dst(output_filename, std::ios::out | std::ios::binary);
-  if (!dst.is_open())
+  std::error_code EC;
+  llvm::raw_fd_ostream dst(output_filename, EC, llvm::sys::fs::F_None);
+  if (EC)
     return Error("Unable to open local file %s", output_filename.c_str());
 
   dst.write(&output_buffer[0], output_buffer.size());
   dst.close();
-  if (!dst)
+  if (dst.has_error())
     return Error("Failed to write file %s", output_filename.c_str());
   return Error();
 }
@@ -428,8 +429,9 @@
   const auto local_file_path = local_file.GetPath();
   llvm::FileRemover local_file_remover(local_file_path);
 
-  std::ofstream dst(local_file_path, std::ios::out | std::ios::binary);
-  if (!dst.is_open())
+  std::error_code EC;
+  llvm::raw_fd_ostream dst(local_file_path, EC, llvm::sys::fs::F_None);
+  if (EC)
     return Error("Unable to open local file %s", local_file_path.c_str());
 
   const auto remote_file_path = remote_file.GetPath(false);
@@ -447,6 +449,9 @@
     if (!eof)
       dst.write(&chunk[0], chunk.size());
   }
+  dst.close();
+  if (dst.has_error())
+    return Error("Failed to write file %s", local_file_path.c_str());
 
   local_file_remover.releaseFile();
   return error;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D31079.92144.patch
Type: text/x-patch
Size: 3840 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20170317/baf80f59/attachment.bin>


More information about the lldb-commits mailing list