Merge "adb: report error in copy_to_file." am: c71a1e7ab0
Change-Id: I9df74be0db95a7b589eae18ed9b1a8077e8215fa
diff --git a/adb/client/adb_install.cpp b/adb/client/adb_install.cpp
index 73dcde1..2bcd0a6 100644
--- a/adb/client/adb_install.cpp
+++ b/adb/client/adb_install.cpp
@@ -227,16 +227,20 @@
return 1;
}
- copy_to_file(local_fd.get(), remote_fd.get());
+ if (!copy_to_file(local_fd.get(), remote_fd.get())) {
+ fprintf(stderr, "adb: failed to install: copy_to_file: %s: %s", file, strerror(errno));
+ return 1;
+ }
char buf[BUFSIZ];
read_status_line(remote_fd.get(), buf, sizeof(buf));
- if (!strncmp("Success", buf, 7)) {
- fputs(buf, stdout);
- return 0;
+ if (strncmp("Success", buf, 7) != 0) {
+ fprintf(stderr, "adb: failed to install %s: %s", file, buf);
+ return 1;
}
- fprintf(stderr, "adb: failed to install %s: %s", file, buf);
- return 1;
+
+ fputs(buf, stdout);
+ return 0;
}
static int install_app_legacy(int argc, const char** argv, bool use_fastdeploy) {
@@ -455,7 +459,12 @@
goto finalize_session;
}
- copy_to_file(local_fd.get(), remote_fd.get());
+ if (!copy_to_file(local_fd.get(), remote_fd.get())) {
+ fprintf(stderr, "adb: failed to write \"%s\": %s\n", file, strerror(errno));
+ success = false;
+ goto finalize_session;
+ }
+
read_status_line(remote_fd.get(), buf, sizeof(buf));
if (strncmp("Success", buf, 7)) {
@@ -634,7 +643,11 @@
goto finalize_multi_package_session;
}
- copy_to_file(local_fd.get(), remote_fd.get());
+ if (!copy_to_file(local_fd.get(), remote_fd.get())) {
+ fprintf(stderr, "adb: failed to write %s: %s\n", split.c_str(), strerror(errno));
+ goto finalize_multi_package_session;
+ }
+
read_status_line(remote_fd.get(), buf, sizeof(buf));
if (strncmp("Success", buf, 7)) {
diff --git a/adb/client/commandline.cpp b/adb/client/commandline.cpp
index a6d7e31..c302965 100644
--- a/adb/client/commandline.cpp
+++ b/adb/client/commandline.cpp
@@ -352,7 +352,8 @@
#endif
}
-void copy_to_file(int inFd, int outFd) {
+bool copy_to_file(int inFd, int outFd) {
+ bool result = true;
std::vector<char> buf(64 * 1024);
int len;
long total = 0;
@@ -375,6 +376,7 @@
}
if (len < 0) {
D("copy_to_file(): read failed: %s", strerror(errno));
+ result = false;
break;
}
if (outFd == STDOUT_FILENO) {
@@ -388,7 +390,8 @@
stdinout_raw_epilogue(inFd, outFd, old_stdin_mode, old_stdout_mode);
- D("copy_to_file() finished after %lu bytes", total);
+ D("copy_to_file() finished with %s after %lu bytes", result ? "success" : "failure", total);
+ return result;
}
static void send_window_size_change(int fd, std::unique_ptr<ShellProtocol>& shell) {
diff --git a/adb/client/commandline.h b/adb/client/commandline.h
index ab77b29..b9dee56 100644
--- a/adb/client/commandline.h
+++ b/adb/client/commandline.h
@@ -100,7 +100,7 @@
int adb_commandline(int argc, const char** argv);
-void copy_to_file(int inFd, int outFd);
+bool copy_to_file(int inFd, int outFd);
// Connects to the device "shell" service with |command| and prints the
// resulting output.