diff options
| author | Ted Woodward <ted.woodward@codeaurora.org> | 2015-05-12 18:47:33 +0000 |
|---|---|---|
| committer | Ted Woodward <ted.woodward@codeaurora.org> | 2015-05-12 18:47:33 +0000 |
| commit | 4744ec6da984f155450683c4aa223678278050a7 (patch) | |
| tree | f0f23fb8a2cab71813005814f79ffc845d72fc2b | |
| parent | f1ac850e7721a79238e213f2e6624bf8a2f3a7bd (diff) | |
| download | bcm5719-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.h | 1 | ||||
| -rw-r--r-- | lldb/source/Host/windows/Windows.cpp | 18 | ||||
| -rw-r--r-- | lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.cpp | 5 | ||||
| -rw-r--r-- | lldb/source/Target/Platform.cpp | 5 |
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 { |

