forked from OSchip/llvm-project
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:
parent
f1ac850e77
commit
4744ec6da9
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue