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
This commit is contained in:
Ted Woodward 2015-05-12 18:47:33 +00:00
parent f1ac850e77
commit 4744ec6da9
4 changed files with 16 additions and 13 deletions

View File

@ -57,6 +57,7 @@ typedef uint32_t pid_t;
int usleep(uint32_t useconds); int usleep(uint32_t useconds);
char* getcwd(char* path, int max); char* getcwd(char* path, int max);
int chdir(const char* path);
char* basename(char *path); char* basename(char *path);
char *dirname(char *path); char *dirname(char *path);

View File

@ -20,6 +20,13 @@
#include <cerrno> #include <cerrno>
#include <ctype.h> #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) int vasprintf(char **ret, const char *fmt, va_list ap)
{ {
char *buf; char *buf;
@ -157,11 +164,16 @@ char* basename(char *path)
return &l1[1]; return &l1[1];
} }
// use _getcwd() instead of GetCurrentDirectory() because it updates errno
char* getcwd(char* path, int max) char* getcwd(char* path, int max)
{ {
if (GetCurrentDirectory(max, path) == 0) return _getcwd(path, max);
return path; }
return NULL;
// use _chdir() instead of SetCurrentDirectory() because it updates errno
int chdir(const char* path)
{
return _chdir(path);
} }
char *dirname(char *path) char *dirname(char *path)

View File

@ -217,15 +217,10 @@ GDBRemoteCommunicationServerPlatform::Handle_QSetWorkingDir (StringExtractorGDBR
std::string path; std::string path;
packet.GetHexByteString (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 this packet is sent to a platform, then change the current working directory
if (::chdir(path.c_str()) != 0) if (::chdir(path.c_str()) != 0)
return SendErrorResponse (errno); return SendErrorResponse (errno);
return SendOKResponse (); return SendOKResponse ();
#endif
} }
GDBRemoteCommunication::PacketResult GDBRemoteCommunication::PacketResult

View File

@ -875,17 +875,12 @@ Platform::SetWorkingDirectory (const ConstString &path)
Log *log = GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PLATFORM); Log *log = GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PLATFORM);
if (log) if (log)
log->Printf("Platform::SetWorkingDirectory('%s')", path.GetCString()); log->Printf("Platform::SetWorkingDirectory('%s')", path.GetCString());
#ifdef _WIN32
// Not implemented on Windows
return false;
#else
if (path) if (path)
{ {
if (chdir(path.GetCString()) == 0) if (chdir(path.GetCString()) == 0)
return true; return true;
} }
return false; return false;
#endif
} }
else else
{ {