diff options
Diffstat (limited to 'adb_install.cpp')
-rw-r--r-- | adb_install.cpp | 58 |
1 files changed, 39 insertions, 19 deletions
diff --git a/adb_install.cpp b/adb_install.cpp index e3b94ea59..5c54468d4 100644 --- a/adb_install.cpp +++ b/adb_install.cpp @@ -24,29 +24,39 @@ #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" 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 +66,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 +86,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 +112,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 +122,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); - 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 +150,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)); } } |