From 3d00a1be21dabae5d3886cd5bb7d3e7a08c06836 Mon Sep 17 00:00:00 2001 From: CTCaer Date: Sun, 14 Jun 2020 12:52:54 +0300 Subject: [PATCH] nyx: Support multiple backup based emuMMC --- nyx/nyx_gui/frontend/fe_emummc_tools.c | 8 ++-- nyx/nyx_gui/frontend/fe_emummc_tools.h | 1 + nyx/nyx_gui/frontend/gui_emummc_tools.c | 62 +++++++++++++++++-------- 3 files changed, 47 insertions(+), 24 deletions(-) diff --git a/nyx/nyx_gui/frontend/fe_emummc_tools.c b/nyx/nyx_gui/frontend/fe_emummc_tools.c index 7448603..0ddd74d 100644 --- a/nyx/nyx_gui/frontend/fe_emummc_tools.c +++ b/nyx/nyx_gui/frontend/fe_emummc_tools.c @@ -119,7 +119,7 @@ void save_emummc_cfg(u32 part_idx, u32 sector_start, const char *path) f_close(&fp); } -static void _update_emummc_base_folder(char *outFilename, u32 sdPathLen, u32 currPartIdx) +void update_emummc_base_folder(char *outFilename, u32 sdPathLen, u32 currPartIdx) { if (currPartIdx < 10) { @@ -170,7 +170,7 @@ static int _dump_emummc_file_part(emmc_tool_gui_t *gui, char *sd_path, sdmmc_sto numSplitParts = (totalSectors + multipartSplitSectors - 1) / multipartSplitSectors; // Continue from where we left, if Partial Backup in progress. - _update_emummc_base_folder(outFilename, sdPathLen, 0); + update_emummc_base_folder(outFilename, sdPathLen, 0); } FIL fp; @@ -217,7 +217,7 @@ static int _dump_emummc_file_part(emmc_tool_gui_t *gui, char *sd_path, sdmmc_sto memset(&fp, 0, sizeof(fp)); currPartIdx++; - _update_emummc_base_folder(outFilename, sdPathLen, currPartIdx); + update_emummc_base_folder(outFilename, sdPathLen, currPartIdx); // Create next part. s_printf(gui->txt_buf, "%s#", outFilename + strlen(gui->base_path)); @@ -386,7 +386,7 @@ void dump_emummc_file(emmc_tool_gui_t *gui) for (int j = 0; j < 100; j++) { - _update_emummc_base_folder(sdPath, base_len, j); + update_emummc_base_folder(sdPath, base_len, j); if(f_stat(sdPath, NULL) == FR_NO_FILE) break; } diff --git a/nyx/nyx_gui/frontend/fe_emummc_tools.h b/nyx/nyx_gui/frontend/fe_emummc_tools.h index 6faab32..9b9213a 100644 --- a/nyx/nyx_gui/frontend/fe_emummc_tools.h +++ b/nyx/nyx_gui/frontend/fe_emummc_tools.h @@ -33,5 +33,6 @@ void load_emummc_cfg(emummc_cfg_t *emu_info); void save_emummc_cfg(u32 part_idx, u32 sector_start, const char *path); void dump_emummc_file(emmc_tool_gui_t *gui); void dump_emummc_raw(emmc_tool_gui_t *gui, int part_idx, u32 sector_start); +void update_emummc_base_folder(char *outFilename, u32 sdPathLen, u32 currPartIdx); #endif diff --git a/nyx/nyx_gui/frontend/gui_emummc_tools.c b/nyx/nyx_gui/frontend/gui_emummc_tools.c index bb39073..c6c1efe 100644 --- a/nyx/nyx_gui/frontend/gui_emummc_tools.c +++ b/nyx/nyx_gui/frontend/gui_emummc_tools.c @@ -447,49 +447,71 @@ static void _migrate_sd_file_based() static void _migrate_sd_backup_file_based() { + char *emu_path = (char *)malloc(128); + char *parts_path = (char *)malloc(128); + char *backup_path = (char *)malloc(128); + char *backup_file_path = (char *)malloc(128); + sd_mount(); f_mkdir("emuMMC"); - f_mkdir("emuMMC/BK00"); - f_mkdir("emuMMC/BK00/eMMC"); + + strcpy(emu_path, "emuMMC/BK"); + u32 base_len = strlen(emu_path); + + for (int j = 0; j < 100; j++) + { + update_emummc_base_folder(emu_path, base_len, j); + if(f_stat(emu_path, NULL) == FR_NO_FILE) + break; + } + base_len = strlen(emu_path); + + f_mkdir(emu_path); + strcat(emu_path, "/eMMC"); + f_mkdir(emu_path); FIL fp; + strcpy(emu_path + base_len, "/file_based"); f_open(&fp, "emuMMC/BK00/file_based", FA_CREATE_ALWAYS | FA_WRITE); f_close(&fp); - char *path = (char *)malloc(128); - char *path2 = (char *)malloc(128); - char *path3 = (char *)malloc(128); + emmcsn_path_impl(backup_path, "", "", NULL); - emmcsn_path_impl(path, "", "", NULL); + s_printf(backup_file_path, "%s/BOOT0", backup_path); + strcpy(emu_path + base_len, "/eMMC/BOOT0"); + f_rename(backup_file_path, emu_path); - s_printf(path2, "%s/BOOT0", path); - f_rename(path2, "emuMMC/BK00/eMMC/BOOT0"); - - s_printf(path2, "%s/BOOT1", path); - f_rename(path2, "emuMMC/BK00/eMMC/BOOT1"); + s_printf(backup_file_path, "%s/BOOT1", backup_path); + strcpy(emu_path + base_len, "/eMMC/BOOT1"); + f_rename(backup_file_path, emu_path); bool multipart = false; - s_printf(path2, "%s/rawnand.bin", path); + s_printf(backup_file_path, "%s/rawnand.bin", backup_path); - if(f_stat(path2, NULL)) + if(f_stat(backup_file_path, NULL)) multipart = true; if (!multipart) - f_rename(path2, "emuMMC/BK00/eMMC/00"); + { + strcpy(emu_path + base_len, "/eMMC/00"); + f_rename(backup_file_path, emu_path); + } else { + emu_path[base_len] = 0; for (int i = 0; i < 32; i++) { - s_printf(path2, "%s/rawnand.bin.%02d", path, i); - s_printf(path3, "emuMMC/BK00/eMMC/%02d", i); - if (f_rename(path2, path3)) + s_printf(backup_file_path, "%s/rawnand.bin.%02d", backup_path, i); + s_printf(parts_path, "%s/eMMC/%02d", emu_path, i); + if (f_rename(backup_file_path, parts_path)) break; } } - free(path); - free(path2); - free(path3); + free(emu_path); + free(parts_path); + free(backup_path); + free(backup_file_path); save_emummc_cfg(0, 0, "emuMMC/BK00"); sd_unmount();