#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "bootloader.h" #include "common.h" #include "cutils/properties.h" #include "firmware.h" #include "install.h" #include "minui/minui.h" #include "minzip/DirUtil.h" #include "roots.h" #include "recovery_ui.h" int signature_check_enabled = 1; int script_assert_enabled = 1; void toggle_signature_check() { signature_check_enabled = !signature_check_enabled; ui_print("Signature Check: %s\n", signature_check_enabled ? "Enabled" : "Disabled"); } void toggle_script_asserts() { script_assert_enabled = !script_assert_enabled; ui_print("Script Asserts: %s\n", script_assert_enabled ? "Enabled" : "Disabled"); } void show_choose_zip_menu() { static char* headers[] = { "Choose a zip or press POWER to return", "", NULL }; char path[PATH_MAX] = ""; DIR *dir; struct dirent *de; int total = 0; int i; char** files; char** list; if (ensure_root_path_mounted("SDCARD:") != 0) { LOGE ("Can't mount /sdcard\n"); return; } dir = opendir("/sdcard"); if (dir == NULL) { LOGE("Couldn't open /sdcard"); return; } const char *extension = ".zip"; const int extension_length = strlen(extension); while ((de=readdir(dir)) != NULL) { if (de->d_name[0] != '.' && strlen(de->d_name) > extension_length && strcmp(de->d_name + strlen(de->d_name) - extension_length, extension) == 0) { total++; } } if (total==0) { LOGE("No tar archives found\n"); if(closedir(dir) < 0) { LOGE("Failed to close directory /sdcard"); return; } } else { files = (char**) malloc((total+1)*sizeof(char*)); files[total]=NULL; list = (char**) malloc((total+1)*sizeof(char*)); list[total]=NULL; rewinddir(dir); i = 0; while ((de = readdir(dir)) != NULL) { if (de->d_name[0] != '.' && strlen(de->d_name) > extension_length && strcmp(de->d_name + strlen(de->d_name) - extension_length, extension) == 0) { files[i] = (char*) malloc(strlen("/sdcard/")+strlen(de->d_name)+1); strcpy(files[i], "/sdcard/"); strcat(files[i], de->d_name); list[i] = (char*) malloc(strlen(de->d_name)+1); strcpy(list[i], de->d_name); i++; } } if (closedir(dir) <0) { LOGE("Failure closing directory /sdcard\n"); return; } int chosen_item = get_menu_selection(headers, list, 1); if (chosen_item >= 0 && chosen_item != GO_BACK) { char sdcard_package_file[1024]; strcpy(sdcard_package_file, "SDCARD:"); strcat(sdcard_package_file, files[chosen_item] + strlen("/sdcard")); ui_print("\n-- Install from sdcard...\n"); set_sdcard_update_bootloader_message(); int status = install_package(sdcard_package_file); if (status != INSTALL_SUCCESS) { ui_set_background(BACKGROUND_ICON_ERROR); ui_print("Installation aborted.\n"); } else if (!ui_text_visible()) { return; // reboot if logs aren't visible } else { if (firmware_update_pending()) { ui_print("\nReboot via menu to complete\n" "installation.\n"); } else { ui_print("\nInstall from sdcard complete.\n"); } } } } }