aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjt1134 <jt1134@gmail.com>2013-02-25 21:22:05 -0600
committerPawit Pornkitprasan <p.pawit@gmail.com>2013-02-27 12:44:28 +0700
commit1ec4e7bddeadeb244d4f5e55d59b2d994e7c7d0f (patch)
tree8e1faadf9b86e9a680dabfc112859a82e12d0aa3
parent74341a38a3c39d330e091cd1af0f48e892acfcd0 (diff)
downloadbootable_recovery-1ec4e7bddeadeb244d4f5e55d59b2d994e7c7d0f.zip
bootable_recovery-1ec4e7bddeadeb244d4f5e55d59b2d994e7c7d0f.tar.gz
bootable_recovery-1ec4e7bddeadeb244d4f5e55d59b2d994e7c7d0f.tar.bz2
adb: handle adbd auth in recovery mode
If /data/misc/adb/adb_keys exists, copy it to /adb_keys, set property for secure adb, and restart the adbd daemon. Change-Id: I2f826d4c1f6a49cb0959c9cd1a803cb10ec4e408
-rw-r--r--etc/init.rc6
-rw-r--r--recovery.c35
2 files changed, 36 insertions, 5 deletions
diff --git a/etc/init.rc b/etc/init.rc
index 70f4daf..241c292 100644
--- a/etc/init.rc
+++ b/etc/init.rc
@@ -52,11 +52,7 @@ service recovery /sbin/recovery
service adbd /sbin/adbd recovery
disabled
-# Always start adbd on userdebug and eng builds
-on property:ro.debuggable=1
- write /sys/class/android_usb/android0/enable 1
- start adbd
- setprop service.adb.root 1
+# Recovery will start adb once it has checked the keys
# Restart adbd so it can run as root
on property:service.adb.root=1
diff --git a/recovery.c b/recovery.c
index 9e5ee94..c70ee3a 100644
--- a/recovery.c
+++ b/recovery.c
@@ -751,6 +751,39 @@ print_property(const char *key, const char *name, void *cookie) {
printf("%s=%s\n", key, name);
}
+static void
+setup_adbd() {
+ struct stat f;
+ static char *key_src = "/data/misc/adb/adb_keys";
+ static char *key_dest = "/adb_keys";
+
+ // Mount /data and copy adb_keys to root if it exists
+ ensure_path_mounted("/data");
+ if (stat(key_src, &f) == 0) {
+ FILE *file_src = fopen(key_src, "r");
+ if (file_src == NULL) {
+ LOGE("Can't open %s\n", key_src);
+ } else {
+ FILE *file_dest = fopen(key_dest, "w");
+ if (file_dest == NULL) {
+ LOGE("Can't open %s\n", key_dest);
+ } else {
+ char buf[4096];
+ while (fgets(buf, sizeof(buf), file_src)) fputs(buf, file_dest);
+ check_and_fclose(file_dest, key_dest);
+
+ // Enable secure adbd
+ property_set("ro.adb.secure", "1");
+ }
+ check_and_fclose(file_src, key_src);
+ }
+ }
+ ensure_path_unmounted("/data");
+
+ // Trigger (re)start of adb daemon
+ property_set("service.adb.root", "1");
+}
+
int
main(int argc, char **argv) {
@@ -912,6 +945,8 @@ main(int argc, char **argv) {
}
}
+ setup_adbd();
+
if (status != INSTALL_SUCCESS && !is_user_initiated_recovery) {
ui_set_show_text(1);
ui_set_background(BACKGROUND_ICON_ERROR);