summaryrefslogtreecommitdiffstats
path: root/recovery.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'recovery.cpp')
-rw-r--r--recovery.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/recovery.cpp b/recovery.cpp
index 2b5c65c9f..ce4358a53 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -45,6 +45,8 @@ extern "C" {
#include "minadbd/adb.h"
}
+struct selabel_handle *sehandle;
+
static const struct option OPTIONS[] = {
{ "send_intent", required_argument, NULL, 's' },
{ "update_package", required_argument, NULL, 'u' },
@@ -140,7 +142,7 @@ fopen_path(const char *path, const char *mode) {
// When writing, try to create the containing directory, if necessary.
// Use generous permissions, the system (init.rc) will reset them.
- if (strchr("wa", mode[0])) dirCreateHierarchy(path, 0777, NULL, 1);
+ if (strchr("wa", mode[0])) dirCreateHierarchy(path, 0777, NULL, 1, sehandle);
FILE *fp = fopen(path, mode);
return fp;
@@ -684,6 +686,10 @@ prompt_and_wait(Device* device) {
break;
case Device::APPLY_EXT:
+ // Some packages expect /cache to be mounted (eg,
+ // standard incremental packages expect to use /cache
+ // as scratch space).
+ ensure_path_mounted(CACHE_ROOT);
status = update_directory(SDCARD_ROOT, SDCARD_ROOT, &wipe_cache, device);
if (status == INSTALL_SUCCESS && wipe_cache) {
ui->Print("\n-- Wiping cache (at package request)...\n");
@@ -803,6 +809,19 @@ main(int argc, char **argv) {
}
}
+#ifdef HAVE_SELINUX
+ struct selinux_opt seopts[] = {
+ { SELABEL_OPT_PATH, "/file_contexts" }
+ };
+
+ sehandle = selabel_open(SELABEL_CTX_FILE, seopts, 1);
+
+ if (!sehandle) {
+ fprintf(stderr, "Warning: No file_contexts\n");
+ ui->Print("Warning: No file_contexts\n");
+ }
+#endif
+
device->StartRecovery();
printf("Command:");