aboutsummaryrefslogtreecommitdiffstats
path: root/recovery.cpp
diff options
context:
space:
mode:
authorSteve Kondik <shade@chemlab.org>2013-10-19 19:49:20 -0700
committerTom Marshall <tdm@cyngn.com>2015-11-20 15:46:34 -0800
commitf30dd3d81206fcfcce0404436fa55c997d03924e (patch)
tree1b9721c8724d6c7c09f523a1c58c155419e712e3 /recovery.cpp
parent7e9b637c45449d2d4607c9f5ba681deb39c5b230 (diff)
downloadbootable_recovery-f30dd3d81206fcfcce0404436fa55c997d03924e.zip
bootable_recovery-f30dd3d81206fcfcce0404436fa55c997d03924e.tar.gz
bootable_recovery-f30dd3d81206fcfcce0404436fa55c997d03924e.tar.bz2
sr: Get a proper shell environment in recovery
* Secure ADB support * Toybox applets * mksh * Various other tools Change-Id: I80b0e2aa5eb7142eaa9f157709f4e029077d8dfa
Diffstat (limited to 'recovery.cpp')
-rw-r--r--recovery.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/recovery.cpp b/recovery.cpp
index da962ba..5288dab 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -52,6 +52,10 @@
#include "fuse_sideload.h"
#include "fuse_sdcard_provider.h"
+extern "C" {
+#include "recovery_cmds.h"
+}
+
struct selabel_handle *sehandle;
static const struct option OPTIONS[] = {
@@ -987,6 +991,40 @@ load_locale_from_cache() {
}
}
+static const char *key_src = "/data/misc/adb/adb_keys";
+static const char *key_dest = "/adb_keys";
+
+
+static void
+setup_adbd() {
+ struct stat f;
+ // 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");
+}
+
static RecoveryUI* gCurrentUI = NULL;
void
@@ -1005,6 +1043,8 @@ ui_print(const char* format, ...) {
}
}
+extern "C" int toybox_driver(int argc, char **argv);
+
int
main(int argc, char **argv) {
// If this binary is started with the single argument "--adbd",
@@ -1019,6 +1059,37 @@ main(int argc, char **argv) {
return 0;
}
+ // Handle alternative invocations
+ char* command = argv[0];
+ char* stripped = strrchr(argv[0], '/');
+ if (stripped)
+ command = stripped + 1;
+
+ if (strcmp(command, "recovery") != 0) {
+ struct recovery_cmd cmd = get_command(command);
+ if (cmd.name)
+ return cmd.main_func(argc, argv);
+
+ if (!strcmp(command, "setup_adbd")) {
+ load_volume_table();
+ setup_adbd();
+ return 0;
+ }
+ if (strstr(argv[0], "start")) {
+ property_set("ctl.start", argv[1]);
+ return 0;
+ }
+ if (strstr(argv[0], "stop")) {
+ property_set("ctl.stop", argv[1]);
+ return 0;
+ }
+ return toybox_driver(argc, argv);
+ }
+
+ // Clear umask for packages that copy files out to /tmp and then over
+ // to /system without properly setting all permissions (eg. gapps).
+ umask(0);
+
time_t start = time(NULL);
// redirect_stdio should be called only in non-sideload mode. Otherwise