Windows: fix bug in getcwd() and add chdir().
authorTed Woodward <ted.woodward@codeaurora.org>
Tue, 12 May 2015 18:47:33 +0000 (18:47 +0000)
committerTed Woodward <ted.woodward@codeaurora.org>
Tue, 12 May 2015 18:47:33 +0000 (18:47 +0000)
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

lldb/include/lldb/Host/windows/win32.h
lldb/source/Host/windows/Windows.cpp
lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.cpp
lldb/source/Target/Platform.cpp

index 8fdc0f8..698e427 100644 (file)
@@ -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);
 
index cb69a9c..b8ee8b2 100644 (file)
 #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)
index 36d6485..f5e5d76 100644 (file)
@@ -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
index c8afe1f..5737521 100644 (file)
@@ -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
     {