[Lldb-commits] [lldb] r239130 - Fix error handling in AdbClient - PushFile and PullFile.
Oleksiy Vyalov
ovyalov at google.com
Thu Jun 4 18:32:46 PDT 2015
Author: ovyalov
Date: Thu Jun 4 20:32:45 2015
New Revision: 239130
URL: http://llvm.org/viewvc/llvm-project?rev=239130&view=rev
Log:
Fix error handling in AdbClient - PushFile and PullFile.
http://reviews.llvm.org/D10176
Modified:
lldb/trunk/source/Plugins/Platform/Android/AdbClient.cpp
lldb/trunk/source/Plugins/Platform/Android/AdbClient.h
Modified: lldb/trunk/source/Plugins/Platform/Android/AdbClient.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/Android/AdbClient.cpp?rev=239130&r1=239129&r2=239130&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/Android/AdbClient.cpp (original)
+++ lldb/trunk/source/Plugins/Platform/Android/AdbClient.cpp Thu Jun 4 20:32:45 2015
@@ -36,6 +36,13 @@ namespace {
const uint32_t kReadTimeout = 1000000; // 1 second
const char * kOKAY = "OKAY";
const char * kFAIL = "FAIL";
+const char * kDATA = "DATA";
+const char * kDONE = "DONE";
+
+const char * kSEND = "SEND";
+const char * kRECV = "RECV";
+const char * kSTAT = "STAT";
+
const size_t kSyncPacketLen = 8;
// Maximum size of a filesync DATA packet.
const size_t kMaxPushData = 2*1024;
@@ -264,7 +271,7 @@ AdbClient::PullFile (const FileSpec &rem
return Error ("Unable to open local file %s", local_file_path.c_str());
const auto remote_file_path = remote_file.GetPath (false);
- error = SendSyncRequest ("RECV", remote_file_path.length (), remote_file_path.c_str ());
+ error = SendSyncRequest (kRECV, remote_file_path.length (), remote_file_path.c_str ());
if (error.Fail ())
return error;
@@ -274,7 +281,7 @@ AdbClient::PullFile (const FileSpec &rem
{
error = PullFileChunk (chunk, eof);
if (error.Fail ())
- return Error ("Failed to read file chunk: %s", error.AsCString ());
+ return error;
if (!eof)
dst.write (&chunk[0], chunk.size ());
}
@@ -298,7 +305,7 @@ AdbClient::PushFile (const FileSpec &loc
std::stringstream file_description;
file_description << remote_file.GetPath(false).c_str() << "," << kDefaultMode;
std::string file_description_str = file_description.str();
- error = SendSyncRequest ("SEND", file_description_str.length(), file_description_str.c_str());
+ error = SendSyncRequest (kSEND, file_description_str.length(), file_description_str.c_str());
if (error.Fail ())
return error;
@@ -306,14 +313,30 @@ AdbClient::PushFile (const FileSpec &loc
while (!src.eof() && !src.read(chunk, kMaxPushData).bad())
{
size_t chunk_size = src.gcount();
- error = SendSyncRequest("DATA", chunk_size, chunk);
+ error = SendSyncRequest(kDATA, chunk_size, chunk);
if (error.Fail ())
return Error ("Failed to send file chunk: %s", error.AsCString ());
}
- error = SendSyncRequest("DONE", local_file.GetModificationTime().seconds(), nullptr);
+ error = SendSyncRequest(kDONE, local_file.GetModificationTime().seconds(), nullptr);
if (error.Fail ())
return error;
- error = ReadResponseStatus();
+
+ std::string response_id;
+ uint32_t data_len;
+ error = ReadSyncHeader (response_id, data_len);
+ if (error.Fail ())
+ return Error ("Failed to read DONE response: %s", error.AsCString ());
+ if (response_id == kFAIL)
+ {
+ std::string error_message (data_len, 0);
+ error = ReadAllBytes (&error_message[0], data_len);
+ if (error.Fail ())
+ return Error ("Failed to read DONE error message: %s", error.AsCString ());
+ return Error ("Failed to push file: %s", error_message.c_str ());
+ }
+ else if (response_id != kOKAY)
+ return Error ("Got unexpected DONE response: %s", response_id.c_str ());
+
// If there was an error reading the source file, finish the adb file
// transfer first so that adb isn't expecting any more data.
if (src.bad())
@@ -356,19 +379,29 @@ AdbClient::PullFileChunk (std::vector<ch
if (error.Fail ())
return error;
- if (response_id == "DATA")
+ if (response_id == kDATA)
{
buffer.resize (data_len, 0);
error = ReadAllBytes (&buffer[0], data_len);
if (error.Fail ())
buffer.clear ();
}
- else if (response_id == "DONE")
+ else if (response_id == kDONE)
+ {
eof = true;
+ }
+ else if (response_id == kFAIL)
+ {
+ std::string error_message (data_len, 0);
+ error = ReadAllBytes (&error_message[0], data_len);
+ if (error.Fail ())
+ return Error ("Failed to read pull error message: %s", error.AsCString ());
+ return Error ("Failed to pull file: %s", error_message.c_str ());
+ }
else
- error = GetResponseError (response_id.c_str ());
+ return Error ("Pull failed with unknown response: %s", response_id.c_str ());
- return error;
+ return Error ();
}
Error
@@ -424,3 +457,39 @@ AdbClient::ReadAllBytes (void *buffer, s
}
return error;
}
+
+Error
+AdbClient::Stat (const FileSpec &remote_file, uint32_t &mode, uint32_t &size, uint32_t &mtime)
+{
+ auto error = StartSync ();
+ if (error.Fail ())
+ return error;
+
+ const std::string remote_file_path (remote_file.GetPath (false));
+ error = SendSyncRequest (kSTAT, remote_file_path.length (), remote_file_path.c_str ());
+ if (error.Fail ())
+ return Error ("Failed to send request: %s", error.AsCString ());
+
+ static const size_t stat_len = strlen (kSTAT);
+ static const size_t response_len = stat_len + (sizeof (uint32_t) * 3);
+
+ std::vector<char> buffer (response_len);
+ error = ReadAllBytes (&buffer[0], buffer.size ());
+ if (error.Fail ())
+ return Error ("Failed to read response: %s", error.AsCString ());
+
+ DataExtractor extractor (&buffer[0], buffer.size (), eByteOrderLittle, sizeof (void*));
+ offset_t offset = 0;
+
+ const void* command = extractor.GetData (&offset, stat_len);
+ if (!command)
+ return Error ("Failed to get response command");
+ const char* command_str = static_cast<const char*> (command);
+ if (strncmp (command_str, kSTAT, stat_len))
+ return Error ("Got invalid stat command: %s", command_str);
+
+ mode = extractor.GetU32 (&offset);
+ size = extractor.GetU32 (&offset);
+ mtime = extractor.GetU32 (&offset);
+ return Error ();
+}
Modified: lldb/trunk/source/Plugins/Platform/Android/AdbClient.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/Android/AdbClient.h?rev=239130&r1=239129&r2=239130&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/Android/AdbClient.h (original)
+++ lldb/trunk/source/Plugins/Platform/Android/AdbClient.h Thu Jun 4 20:32:45 2015
@@ -59,6 +59,9 @@ public:
Error
PushFile (const FileSpec &local_file, const FileSpec &remote_file);
+ Error
+ Stat (const FileSpec &remote_file, uint32_t &mode, uint32_t &size, uint32_t &mtime);
+
private:
Error
Connect ();
More information about the lldb-commits
mailing list