Fix the communication in qPlatform_[mkdir,chmod]

With the previous implementation the protocol used by the client and the
server for the response was different and worked only by an accident.
With this change the communication is fixed and the return code from
mkdir and chmod correctly captured by lldb. The change also add
documentation for the qPlatform__[mkdir,chmod] packages.

Differential revision: http://reviews.llvm.org/D7786

llvm-svn: 230213
This commit is contained in:
Tamas Berghammer 2015-02-23 11:03:08 +00:00
parent 04e6314cf4
commit 0f86b74304
3 changed files with 67 additions and 19 deletions

View File

@ -503,6 +503,48 @@ drwxrwxr-x 5 username groupname 4096 Aug 15 21:36 source.cpp
-rw-r--r-- 1 username groupname 2792 Aug 12 16:46 a.out
-rw-r--r-- 1 username groupname 3190 Aug 12 16:46 Makefile
//----------------------------------------------------------------------
// "qPlatform_mkdir"
//
// BRIEF
// Creates a new directory on the connected remote machine.
//
// PRIORITY TO IMPLEMENT
// Low. This command allows LLDB clients to create new directories on
// a remote host.
//
/----------------------------------------------------------------------
Request:
qPlatform_mkdir:<hex-file-mode>,<ascii-hex-path>
Reply:
F<mkdir-return-code>
mkdir called successfully and returned with the given return code
Exx
An error occurred
//----------------------------------------------------------------------
// "qPlatform_chmod"
//
// BRIEF
// Creates a new directory on the connected remote machine.
//
// PRIORITY TO IMPLEMENT
// Low. This command allows LLDB clients to change the permissions of
// a file on the remote host.
//
/----------------------------------------------------------------------
Request:
qPlatform_chmod:<hex-file-mode>,<ascii-hex-path>
Reply:
F<chmod-return-code>
chmod called successfully and returned with the given return code
Exx
An error occurred
//----------------------------------------------------------------------
// "qHostInfo"
//

View File

@ -3168,12 +3168,14 @@ GDBRemoteCommunicationClient::MakeDirectory (const char *path,
const char *packet = stream.GetData();
int packet_len = stream.GetSize();
StringExtractorGDBRemote response;
if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success)
{
return Error(response.GetHexMaxU32(false, UINT32_MAX), eErrorTypePOSIX);
}
return Error();
if (SendPacketAndWaitForResponse(packet, packet_len, response, false) != PacketResult::Success)
return Error("failed to send '%s' packet", packet);
if (response.GetChar() != 'F')
return Error("invalid response to '%s' packet", packet);
return Error(response.GetU32(UINT32_MAX), eErrorTypePOSIX);
}
Error
@ -3188,12 +3190,14 @@ GDBRemoteCommunicationClient::SetFilePermissions (const char *path,
const char *packet = stream.GetData();
int packet_len = stream.GetSize();
StringExtractorGDBRemote response;
if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success)
{
return Error(response.GetHexMaxU32(false, UINT32_MAX), eErrorTypePOSIX);
}
return Error();
if (SendPacketAndWaitForResponse(packet, packet_len, response, false) != PacketResult::Success)
return Error("failed to send '%s' packet", packet);
if (response.GetChar() != 'F')
return Error("invalid response to '%s' packet", packet);
return Error(response.GetU32(false, UINT32_MAX), eErrorTypePOSIX);
}
static uint64_t

View File

@ -846,10 +846,11 @@ GDBRemoteCommunicationServerCommon::Handle_qPlatform_mkdir (StringExtractorGDBRe
std::string path;
packet.GetHexByteString(path);
Error error = FileSystem::MakeDirectory(path.c_str(), mode);
if (error.Success())
return SendPacketNoLock ("OK", 2);
else
return SendErrorResponse(error.GetError());
StreamGDBRemote response;
response.Printf("F%u", error.GetError());
return SendPacketNoLock(response.GetData(), response.GetSize());
}
return SendErrorResponse(20);
}
@ -865,10 +866,11 @@ GDBRemoteCommunicationServerCommon::Handle_qPlatform_chmod (StringExtractorGDBRe
std::string path;
packet.GetHexByteString(path);
Error error = FileSystem::SetFilePermissions(path.c_str(), mode);
if (error.Success())
return SendPacketNoLock ("OK", 2);
else
return SendErrorResponse(error.GetError());
StreamGDBRemote response;
response.Printf("F%u", error.GetError());
return SendPacketNoLock(response.GetData(), response.GetSize());
}
return SendErrorResponse(19);
}