summaryrefslogtreecommitdiffstats
path: root/gui/action.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gui/action.cpp')
-rwxr-xr-xgui/action.cpp94
1 files changed, 92 insertions, 2 deletions
diff --git a/gui/action.cpp b/gui/action.cpp
index 4b644a9b4..c4e78cf26 100755
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -231,6 +231,8 @@ GUIAction::GUIAction(xml_node<>* node)
ADD_ACTION(twcmd);
ADD_ACTION(setbootslot);
ADD_ACTION(installapp);
+ ADD_ACTION(repackimage);
+ ADD_ACTION(fixabrecoverybootloop);
}
// First, get the action
@@ -1196,7 +1198,7 @@ int GUIAction::nandroid(std::string arg)
string Backup_Name;
DataManager::GetValue(TW_BACKUP_NAME, Backup_Name);
string auto_gen = gui_lookup("auto_generate", "(Auto Generate)");
- if (Backup_Name == auto_gen || Backup_Name == gui_lookup("curr_date", "(Current Date)") || Backup_Name == "0" || Backup_Name == "(" || PartitionManager.Check_Backup_Name(true) == 0) {
+ if (Backup_Name == auto_gen || Backup_Name == gui_lookup("curr_date", "(Current Date)") || Backup_Name == "0" || Backup_Name == "(" || PartitionManager.Check_Backup_Name(Backup_Name, true, true) == 0) {
ret = PartitionManager.Run_Backup(false);
DataManager::SetValue("tw_encrypt_backup", 0); // reset value so we don't encrypt every subsequent backup
if (!PartitionManager.stop_backup.get_value()) {
@@ -1472,7 +1474,9 @@ int GUIAction::checkbackupname(std::string arg __unused)
if (simulate) {
simulate_progress_bar();
} else {
- op_status = PartitionManager.Check_Backup_Name(true);
+ string Backup_Name;
+ DataManager::GetValue(TW_BACKUP_NAME, Backup_Name);
+ op_status = PartitionManager.Check_Backup_Name(Backup_Name, true, true);
if (op_status != 0)
op_status = 1;
}
@@ -2053,3 +2057,89 @@ exit:
operation_end(0);
return 0;
}
+
+int GUIAction::repackimage(std::string arg __unused)
+{
+ int op_status = 1;
+ operation_start("Repack Image");
+ if (!simulate)
+ {
+ std::string path = DataManager::GetStrValue("tw_filename");
+ Repack_Options_struct Repack_Options;
+ Repack_Options.Disable_Verity = false;
+ Repack_Options.Disable_Force_Encrypt = false;
+ Repack_Options.Backup_First = DataManager::GetIntValue("tw_repack_backup_first") != 0;
+ if (DataManager::GetIntValue("tw_repack_kernel") == 1)
+ Repack_Options.Type = REPLACE_KERNEL;
+ else
+ Repack_Options.Type = REPLACE_RAMDISK;
+ if (!PartitionManager.Repack_Images(path, Repack_Options))
+ goto exit;
+ } else
+ simulate_progress_bar();
+ op_status = 0;
+exit:
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::fixabrecoverybootloop(std::string arg __unused)
+{
+ int op_status = 1;
+ operation_start("Repack Image");
+ if (!simulate)
+ {
+ if (!TWFunc::Path_Exists("/sbin/magiskboot")) {
+ LOGERR("Image repacking tool not present in this TWRP build!");
+ goto exit;
+ }
+ DataManager::SetProgress(0);
+ TWPartition* part = PartitionManager.Find_Partition_By_Path("/boot");
+ if (part)
+ gui_msg(Msg("unpacking_image=Unpacking {1}...")(part->Display_Name));
+ else {
+ gui_msg(Msg(msg::kError, "unable_to_locate=Unable to locate {1}.")("/boot"));
+ goto exit;
+ }
+ if (!PartitionManager.Prepare_Repack(part, REPACK_ORIG_DIR, DataManager::GetIntValue("tw_repack_backup_first") != 0, gui_lookup("repack", "Repack")))
+ goto exit;
+ DataManager::SetProgress(.25);
+ gui_msg("fixing_recovery_loop_patch=Patching kernel...");
+ std::string command = "cd " REPACK_ORIG_DIR " && /sbin/magiskboot --hexpatch kernel 77616E745F696E697472616D667300 736B69705F696E697472616D667300";
+ if (TWFunc::Exec_Cmd(command) != 0) {
+ gui_msg(Msg(msg::kError, "fix_recovery_loop_patch_error=Error patching kernel."));
+ goto exit;
+ }
+ std::string header_path = REPACK_ORIG_DIR;
+ header_path += "header";
+ if (TWFunc::Path_Exists(header_path)) {
+ command = "cd " REPACK_ORIG_DIR " && sed -i \"s|$(grep '^cmdline=' header | cut -d= -f2-)|$(grep '^cmdline=' header | cut -d= -f2- | sed -e 's/skip_override//' -e 's/ */ /g' -e 's/[ \t]*$//')|\" header";
+ if (TWFunc::Exec_Cmd(command) != 0) {
+ gui_msg(Msg(msg::kError, "fix_recovery_loop_patch_error=Error patching kernel."));
+ goto exit;
+ }
+ }
+ DataManager::SetProgress(.5);
+ gui_msg(Msg("repacking_image=Repacking {1}...")(part->Display_Name));
+ command = "cd " REPACK_ORIG_DIR " && /sbin/magiskboot --repack " REPACK_ORIG_DIR "boot.img";
+ if (TWFunc::Exec_Cmd(command) != 0) {
+ gui_msg(Msg(msg::kError, "repack_error=Error repacking image."));
+ goto exit;
+ }
+ DataManager::SetProgress(.75);
+ std::string path = REPACK_ORIG_DIR;
+ std::string file = "new-boot.img";
+ DataManager::SetValue("tw_flash_partition", "/boot;");
+ if (!PartitionManager.Flash_Image(path, file)) {
+ LOGINFO("Error flashing new image\n");
+ goto exit;
+ }
+ DataManager::SetProgress(1);
+ TWFunc::removeDir(REPACK_ORIG_DIR, false);
+ } else
+ simulate_progress_bar();
+ op_status = 0;
+exit:
+ operation_end(op_status);
+ return 0;
+}