From 4623b9d3e2bf1d19a46461745b9cf1047e67abd2 Mon Sep 17 00:00:00 2001 From: Jim Ingham Date: Sat, 6 Dec 2014 01:41:10 +0000 Subject: [PATCH] Reverting r223548 which broke running in the shell on OS X. llvm-svn: 223568 --- lldb/source/Host/common/FileSpec.cpp | 29 ++++++++--------------------- lldb/source/Host/common/Host.cpp | 23 ++++++++++++----------- lldb/source/Host/common/HostInfoBase.cpp | 18 ++++++------------ lldb/source/Host/windows/FileSystem.cpp | 2 +- lldb/source/Target/ProcessLaunchInfo.cpp | 9 ++++----- 5 files changed, 31 insertions(+), 50 deletions(-) diff --git a/lldb/source/Host/common/FileSpec.cpp b/lldb/source/Host/common/FileSpec.cpp index 0af0556..7cd7729 100644 --- a/lldb/source/Host/common/FileSpec.cpp +++ b/lldb/source/Host/common/FileSpec.cpp @@ -1340,31 +1340,18 @@ FileSpec::IsSourceImplementationFile () const bool FileSpec::IsRelativeToCurrentWorkingDirectory () const { - const char *dir = m_directory.GetCString(); - llvm::StringRef directory(dir ? dir : ""); - - if (directory.size() > 0) + const char *directory = m_directory.GetCString(); + if (directory && directory[0]) { - if (m_syntax == ePathSyntaxWindows) + // If the path doesn't start with '/' or '~', return true + switch (directory[0]) { - if (directory.size() >= 2 && directory[1] == ':') - return false; - if (directory[0] == '/') - return false; + case '/': + case '~': + return false; + default: return true; } - else - { - // If the path doesn't start with '/' or '~', return true - switch (directory[0]) - { - case '/': - case '~': - return false; - default: - return true; - } - } } else if (m_filename) { diff --git a/lldb/source/Host/common/Host.cpp b/lldb/source/Host/common/Host.cpp index 569cecc..a3a22e2 100644 --- a/lldb/source/Host/common/Host.cpp +++ b/lldb/source/Host/common/Host.cpp @@ -44,7 +44,6 @@ // C++ includes #include -#include "lldb/Host/FileSystem.h" #include "lldb/Host/Host.h" #include "lldb/Host/HostInfo.h" #include "lldb/Core/ArchSpec.h" @@ -557,7 +556,8 @@ Host::RunShellCommand (const char *command, if (working_dir) launch_info.SetWorkingDirectory(working_dir); - llvm::SmallString output_file_path; + char output_file_path_buffer[PATH_MAX]; + const char *output_file_path = NULL; if (command_output_ptr) { @@ -567,19 +567,21 @@ Host::RunShellCommand (const char *command, FileSpec tmpdir_file_spec; if (HostInfo::GetLLDBPath(ePathTypeLLDBTempSystemDir, tmpdir_file_spec)) { - tmpdir_file_spec.AppendPathComponent("lldb-shell-output.%%%%%%"); - llvm::sys::fs::createUniqueFile(tmpdir_file_spec.GetPath().c_str(), output_file_path); + tmpdir_file_spec.AppendPathComponent("lldb-shell-output.XXXXXX"); + strncpy(output_file_path_buffer, tmpdir_file_spec.GetPath().c_str(), sizeof(output_file_path_buffer)); } else { - llvm::sys::fs::createTemporaryFile("lldb-shell-output.%%%%%%", "", output_file_path); + strncpy(output_file_path_buffer, "/tmp/lldb-shell-output.XXXXXX", sizeof(output_file_path_buffer)); } + + output_file_path = ::mktemp(output_file_path_buffer); } launch_info.AppendSuppressFileAction (STDIN_FILENO, true, false); - if (!output_file_path.empty()) + if (output_file_path) { - launch_info.AppendOpenFileAction(STDOUT_FILENO, output_file_path.c_str(), false, true); + launch_info.AppendOpenFileAction(STDOUT_FILENO, output_file_path, false, true); launch_info.AppendDuplicateFileAction(STDOUT_FILENO, STDERR_FILENO); } else @@ -638,7 +640,7 @@ Host::RunShellCommand (const char *command, if (command_output_ptr) { command_output_ptr->clear(); - FileSpec file_spec(output_file_path.c_str(), File::eOpenOptionRead); + FileSpec file_spec(output_file_path, File::eOpenOptionRead); uint64_t file_size = file_spec.GetByteSize(); if (file_size > 0) { @@ -657,9 +659,8 @@ Host::RunShellCommand (const char *command, shell_info->can_delete.SetValue(true, eBroadcastAlways); } - FileSpec output_file_spec(output_file_path.c_str(), false); - if (FileSystem::GetFileExists(output_file_spec)) - FileSystem::Unlink(output_file_path.c_str()); + if (output_file_path) + ::unlink (output_file_path); // Handshake with the monitor thread, or just let it know in advance that // it can delete "shell_info" in case we timed out and were not able to kill // the process... diff --git a/lldb/source/Host/common/HostInfoBase.cpp b/lldb/source/Host/common/HostInfoBase.cpp index d65b796..9eab299 100644 --- a/lldb/source/Host/common/HostInfoBase.cpp +++ b/lldb/source/Host/common/HostInfoBase.cpp @@ -18,9 +18,7 @@ #include "lldb/Host/HostInfoBase.h" #include "llvm/ADT/Triple.h" -#include "llvm/ADT/StringExtras.h" #include "llvm/Support/Host.h" -#include "llvm/Support/raw_ostream.h" #include @@ -266,23 +264,19 @@ HostInfoBase::ComputeTempFileDirectory(FileSpec &file_spec) if (!tmpdir_cstr) return false; - FileSpec temp_file_spec(tmpdir_cstr, false); - temp_file_spec.AppendPathComponent("lldb"); - if (!FileSystem::MakeDirectory(temp_file_spec.GetPath().c_str(), eFilePermissionsDirectoryDefault).Success()) + StreamString pid_tmpdir; + pid_tmpdir.Printf("%s/lldb", tmpdir_cstr); + if (!FileSystem::MakeDirectory(pid_tmpdir.GetString().c_str(), eFilePermissionsDirectoryDefault).Success()) return false; - std::string pid_str; - llvm::raw_string_ostream pid_stream(pid_str); - pid_stream << Host::GetCurrentProcessID(); - temp_file_spec.AppendPathComponent(pid_stream.str().c_str()); - std::string final_path = temp_file_spec.GetPath(); - if (!FileSystem::MakeDirectory(final_path.c_str(), eFilePermissionsDirectoryDefault).Success()) + pid_tmpdir.Printf("/%" PRIu64, Host::GetCurrentProcessID()); + if (!FileSystem::MakeDirectory(pid_tmpdir.GetString().c_str(), eFilePermissionsDirectoryDefault).Success()) return false; // Make an atexit handler to clean up the process specify LLDB temp dir // and all of its contents. ::atexit(CleanupProcessSpecificLLDBTempDir); - file_spec.GetDirectory().SetCStringWithLength(final_path.c_str(), final_path.size()); + file_spec.GetDirectory().SetCStringWithLength(pid_tmpdir.GetString().c_str(), pid_tmpdir.GetString().size()); return true; } diff --git a/lldb/source/Host/windows/FileSystem.cpp b/lldb/source/Host/windows/FileSystem.cpp index f641ff5..a735ff0 100644 --- a/lldb/source/Host/windows/FileSystem.cpp +++ b/lldb/source/Host/windows/FileSystem.cpp @@ -27,7 +27,7 @@ FileSystem::MakeDirectory(const char *path, uint32_t file_permissions) // On Win32, the mode parameter is ignored, as Windows files and directories support a // different permission model than POSIX. Error error; - if (!::CreateDirectory(path, NULL) && GetLastError() != ERROR_ALREADY_EXISTS) + if (!::CreateDirectory(path, NULL)) error.SetError(::GetLastError(), lldb::eErrorTypeWin32); return error; } diff --git a/lldb/source/Target/ProcessLaunchInfo.cpp b/lldb/source/Target/ProcessLaunchInfo.cpp index a4dd363..d5f3d51 100644 --- a/lldb/source/Target/ProcessLaunchInfo.cpp +++ b/lldb/source/Target/ProcessLaunchInfo.cpp @@ -396,15 +396,14 @@ ProcessLaunchInfo::ConvertArgumentsForLaunchingInShell (Error &error, Args shell_arguments; std::string safe_arg; shell_arguments.AppendArgument (shell_executable.c_str()); - + shell_arguments.AppendArgument ("-c"); StreamString shell_command; if (will_debug) { // Add a modified PATH environment variable in case argv[0] - // is a relative path. + // is a relative path const char *argv0 = argv[0]; - FileSpec arg_spec(argv0, false); - if (arg_spec.IsRelativeToCurrentWorkingDirectory()) + if (argv0 && (argv0[0] != '/' && argv0[0] != '~')) { // We have a relative path to our executable which may not work if // we just try to run "a.out" (without it being converted to "./a.out") @@ -435,7 +434,7 @@ ProcessLaunchInfo::ConvertArgumentsForLaunchingInShell (Error &error, shell_command.PutCString(new_path.c_str()); } - shell_command.PutCString("exec"); + shell_command.PutCString ("exec"); // Only Apple supports /usr/bin/arch being able to specify the architecture if (GetArchitecture().IsValid() && // Valid architecture -- 2.7.4