summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTed Woodward <ted.woodward@codeaurora.org>2015-05-12 18:47:33 +0000
committerTed Woodward <ted.woodward@codeaurora.org>2015-05-12 18:47:33 +0000
commit4744ec6da984f155450683c4aa223678278050a7 (patch)
treef0f23fb8a2cab71813005814f79ffc845d72fc2b
parentf1ac850e7721a79238e213f2e6624bf8a2f3a7bd (diff)
downloadbcm5719-llvm-4744ec6da984f155450683c4aa223678278050a7.tar.gz
bcm5719-llvm-4744ec6da984f155450683c4aa223678278050a7.zip
Windows: fix bug in getcwd() and add chdir().
Summary: GetCurrentDirectory() returns the number of characters copied; 0 is a failure, not a success. Add implementation for chdir(). Reviewers: zturner Reviewed By: zturner Subscribers: lldb-commits Differential Revision: http://reviews.llvm.org/D9300 llvm-svn: 237162
-rw-r--r--lldb/include/lldb/Host/windows/win32.h1
-rw-r--r--lldb/source/Host/windows/Windows.cpp18
-rw-r--r--lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.cpp5
-rw-r--r--lldb/source/Target/Platform.cpp5
4 files changed, 16 insertions, 13 deletions
diff --git a/lldb/include/lldb/Host/windows/win32.h b/lldb/include/lldb/Host/windows/win32.h
index 8fdc0f80de1..698e427e404 100644
--- a/lldb/include/lldb/Host/windows/win32.h
+++ b/lldb/include/lldb/Host/windows/win32.h
@@ -57,6 +57,7 @@ typedef uint32_t pid_t;
int usleep(uint32_t useconds);
char* getcwd(char* path, int max);
+int chdir(const char* path);
char* basename(char *path);
char *dirname(char *path);
diff --git a/lldb/source/Host/windows/Windows.cpp b/lldb/source/Host/windows/Windows.cpp
index cb69a9cb3e4..b8ee8b2a65e 100644
--- a/lldb/source/Host/windows/Windows.cpp
+++ b/lldb/source/Host/windows/Windows.cpp
@@ -20,6 +20,13 @@
#include <cerrno>
#include <ctype.h>
+// These prototypes are defined in <direct.h>, but it also defines chdir() and getcwd(), giving multiply defined errors
+extern "C"
+{
+ char *_getcwd(char *buffer, int maxlen);
+ int _chdir(const char *path);
+}
+
int vasprintf(char **ret, const char *fmt, va_list ap)
{
char *buf;
@@ -157,11 +164,16 @@ char* basename(char *path)
return &l1[1];
}
+// use _getcwd() instead of GetCurrentDirectory() because it updates errno
char* getcwd(char* path, int max)
{
- if (GetCurrentDirectory(max, path) == 0)
- return path;
- return NULL;
+ return _getcwd(path, max);
+}
+
+// use _chdir() instead of SetCurrentDirectory() because it updates errno
+int chdir(const char* path)
+{
+ return _chdir(path);
}
char *dirname(char *path)
diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.cpp
index 36d64857046..f5e5d76f2e6 100644
--- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.cpp
@@ -217,15 +217,10 @@ GDBRemoteCommunicationServerPlatform::Handle_QSetWorkingDir (StringExtractorGDBR
std::string path;
packet.GetHexByteString (path);
-#ifdef _WIN32
- // Not implemented on Windows
- return SendUnimplementedResponse ("GDBRemoteCommunicationServerPlatform::Handle_QSetWorkingDir unimplemented");
-#else
// If this packet is sent to a platform, then change the current working directory
if (::chdir(path.c_str()) != 0)
return SendErrorResponse (errno);
return SendOKResponse ();
-#endif
}
GDBRemoteCommunication::PacketResult
diff --git a/lldb/source/Target/Platform.cpp b/lldb/source/Target/Platform.cpp
index c8afe1fe68a..57375215981 100644
--- a/lldb/source/Target/Platform.cpp
+++ b/lldb/source/Target/Platform.cpp
@@ -875,17 +875,12 @@ Platform::SetWorkingDirectory (const ConstString &path)
Log *log = GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PLATFORM);
if (log)
log->Printf("Platform::SetWorkingDirectory('%s')", path.GetCString());
-#ifdef _WIN32
- // Not implemented on Windows
- return false;
-#else
if (path)
{
if (chdir(path.GetCString()) == 0)
return true;
}
return false;
-#endif
}
else
{
OpenPOWER on IntegriCloud