summaryrefslogtreecommitdiffstats
path: root/adb_install.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'adb_install.cpp')
-rw-r--r--adb_install.cpp59
1 files changed, 40 insertions, 19 deletions
diff --git a/adb_install.cpp b/adb_install.cpp
index 4aed9d4b1..d9936f222 100644
--- a/adb_install.cpp
+++ b/adb_install.cpp
@@ -24,29 +24,40 @@
#include <sys/stat.h>
#include <signal.h>
#include <fcntl.h>
+#include <stdio.h>
#include "ui.h"
#include "cutils/properties.h"
-#include "install.h"
-#include "common.h"
#include "adb_install.h"
#include "minadbd/fuse_adb_provider.h"
#include "fuse_sideload.h"
+#include "verifier.h"
static RecoveryUI* ui = NULL;
-static void
+void
set_usb_driver(bool enabled) {
int fd = open("/sys/class/android_usb/android0/enable", O_WRONLY);
if (fd < 0) {
+/* These error messages show when built in older Android branches (e.g. Gingerbread)
+ It's not a critical error so we're disabling the error messages.
ui->Print("failed to open driver control: %s\n", strerror(errno));
+*/
+ printf("failed to open driver control: %s\n", strerror(errno));
return;
}
+
if (TEMP_FAILURE_RETRY(write(fd, enabled ? "1" : "0", 1)) == -1) {
+/*
ui->Print("failed to set driver control: %s\n", strerror(errno));
+*/
+ printf("failed to set driver control: %s\n", strerror(errno));
}
if (close(fd) < 0) {
+/*
ui->Print("failed to close driver control: %s\n", strerror(errno));
+*/
+ printf("failed to close driver control: %s\n", strerror(errno));
}
}
@@ -56,11 +67,16 @@ stop_adbd() {
set_usb_driver(false);
}
+bool is_ro_debuggable() {
+ char value[PROPERTY_VALUE_MAX+1];
+ return (property_get("ro.debuggable", value, NULL) == 1 && value[0] == '1');
+}
-static void
+void
maybe_restart_adbd() {
+ char value[PROPERTY_VALUE_MAX+1];
if (is_ro_debuggable()) {
- ui->Print("Restarting adbd...\n");
+ printf("Restarting adbd...\n");
set_usb_driver(true);
property_set("ctl.start", "adbd");
}
@@ -71,23 +87,23 @@ maybe_restart_adbd() {
#define ADB_INSTALL_TIMEOUT 300
int
-apply_from_adb(RecoveryUI* ui_, bool* wipe_cache, const char* install_file) {
- modified_flash = true;
-
- ui = ui_;
+apply_from_adb(const char* install_file, pid_t* child_pid) {
stop_adbd();
set_usb_driver(true);
-
+/*
ui->Print("\n\nNow send the package you want to apply\n"
"to the device with \"adb sideload <filename>\"...\n");
-
+*/
pid_t child;
if ((child = fork()) == 0) {
- execl("/sbin/recovery", "recovery", "--adbd", NULL);
+ execl("/sbin/recovery", "recovery", "--adbd", install_file, NULL);
_exit(-1);
}
+ *child_pid = child;
+ // caller can now kill the child thread from another thread
+
// FUSE_SIDELOAD_HOST_PATHNAME will start to exist once the host
// connects and starts serving a package. Poll for its
// appearance. (Note that inotify doesn't work with FUSE.)
@@ -97,7 +113,7 @@ apply_from_adb(RecoveryUI* ui_, bool* wipe_cache, const char* install_file) {
struct stat st;
for (int i = 0; i < ADB_INSTALL_TIMEOUT; ++i) {
if (waitpid(child, &status, WNOHANG) != 0) {
- result = INSTALL_ERROR;
+ result = -1;
waited = true;
break;
}
@@ -107,16 +123,20 @@ apply_from_adb(RecoveryUI* ui_, bool* wipe_cache, const char* install_file) {
sleep(1);
continue;
} else {
- ui->Print("\nTimed out waiting for package.\n\n");
- result = INSTALL_ERROR;
+ printf("\nTimed out waiting for package: %s\n\n", strerror(errno));
+ result = -1;
kill(child, SIGKILL);
break;
}
}
- result = install_package(FUSE_SIDELOAD_HOST_PATHNAME, wipe_cache, install_file, false, 0);
- break;
+ // Install is handled elsewhere in TWRP
+ //install_package(FUSE_SIDELOAD_HOST_PATHNAME, wipe_cache, install_file, false);
+ return 0;
}
+ // if we got here, something failed
+ *child_pid = 0;
+
if (!waited) {
// Calling stat() on this magic filename signals the minadbd
// subprocess to shut down.
@@ -131,9 +151,10 @@ apply_from_adb(RecoveryUI* ui_, bool* wipe_cache, const char* install_file) {
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
if (WEXITSTATUS(status) == 3) {
- ui->Print("\nYou need adb 1.0.32 or newer to sideload\nto this device.\n\n");
+ printf("\nYou need adb 1.0.32 or newer to sideload\nto this device.\n\n");
+ result = -2;
} else if (!WIFSIGNALED(status)) {
- ui->Print("\n(adbd status %d)\n", WEXITSTATUS(status));
+ printf("status %d\n", WEXITSTATUS(status));
}
}