diff options
Diffstat (limited to 'recovery.cpp')
-rw-r--r-- | recovery.cpp | 21 |
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:"); |