void Menu_Partition(bool must_select) { int i; s32 ret = 0; int pnum = WBFS_GetPartitionCount(); struct Menu menu; char active[256]; menu_init(&menu, pnum); menu_init_active(&menu, active, 256); loop: menu_begin(&menu); /* Clear console */ Con_Clear(); FgColor(CFG.color_header); printf_x(gt("Select a partition")); printf(":\n\n"); DefaultColor(); printf_("P# Name\n"); printf_("-----------------------------\n"); // P#1 ram1ro // P#2 sda1ro // P#3 sda2ro char partname[32]; for (i = 0; i < pnum; i++) { memset(partname, 0, 32); WBFS_GetPartitionName(i, (char *) &partname); MENU_MARK(); printf("%d %s\n", i, partname); } printf("\n"); printf_h(gt("Press %s button to select."), (button_names[CFG.button_confirm.num])); printf("\n"); printf_h(gt("Press %s button to go back."), (button_names[CFG.button_cancel.num])); printf("\n"); u32 buttons = Wpad_WaitButtonsCommon(); menu_move(&menu, buttons); // B button if (buttons & CFG.button_cancel.mask) { if (must_select) { if (WBFS_Selected()) return; printf("\n"); printf_(gt("No partition selected!")); printf("\n"); sleep(2); } else { return; } } // A button if (buttons & CFG.button_confirm.mask) { i = menu.current; __console_flush(0); ret = WBFS_OpenPart(i, CFG.partition); if (ret == 0) { if (must_select) { // called from global options __Menu_GetEntries(); } return; } } goto loop; }
s32 WBFS_OpenNamed(char *partition) { u32 i; u32 part_fs = PART_FS_WBFS; u32 part_idx = 0; u32 part_lba = 0; s32 ret = 0; PartList plist; // close WBFS_Close(); // parse partition option if (strncasecmp(partition, "WBFS", 4) == 0) { i = atoi(partition+4); if (i < 1 || i > 4) goto err; part_fs = PART_FS_WBFS; part_idx = i; } else if (strncasecmp(partition, "FAT", 3) == 0) { if (wbfsDev != WBFS_DEVICE_USB) goto err; i = atoi(partition+3); if (i < 1 || i > 9) goto err; part_fs = PART_FS_FAT; part_idx = i; } else if (strncasecmp(partition, "NTFS", 4) == 0) { i = atoi(partition+4); if (i < 1 || i > 9) goto err; part_fs = PART_FS_NTFS; part_idx = i; } else { goto err; } // Get partition entries ret = Partition_GetList(wbfsDev, &plist); if (ret || plist.num == 0) return -1; if (part_fs == PART_FS_WBFS) { if (part_idx > plist.wbfs_n) goto err; for (i=0; i<plist.num; i++) { if (plist.pinfo[i].wbfs_i == part_idx) break; } } else if (part_fs == PART_FS_FAT) { if (part_idx > plist.fat_n) goto err; for (i=0; i<plist.num; i++) { if (plist.pinfo[i].fat_i == part_idx) break; } } else if (part_fs == PART_FS_NTFS) { if (part_idx > plist.ntfs_n) goto err; for (i=0; i<plist.num; i++) { if (plist.pinfo[i].ntfs_i == part_idx) break; } } if (i >= plist.num) goto err; // set partition lba sector part_lba = plist.pentry[i].sector; if (WBFS_OpenPart(part_fs, part_idx, part_lba, plist.pentry[i].size, partition)) { goto err; } // success return 0; err: return -1; }
s32 WBFS_OpenNamed(char *partition) { int i = 0; u32 part_fs = PART_FS_WBFS; u32 part_idx = 0; u32 part_lba = 0; s32 ret = 0; PartList plist; int x, fs; // close WBFS_Close(); dbg_printf("open_part(%s)\n", partition); // Get partition entries ret = Partition_GetList(wbfsDev, &plist); if (ret || plist.num == 0) return -1; // parse partition option if (strcasecmp(partition, "auto") == 0) { int fs_list[] = { PART_FS_WBFS, PART_FS_FAT, PART_FS_NTFS }; // PART_FS_EXT int n = sizeof(fs_list) / sizeof(int); for (x=0; x<n; x++) { fs = fs_list[x]; i = PartList_FindFS(&plist, fs, 1, NULL); if (i < 0) continue; if ((fs == PART_FS_WBFS) || is_game_fs(wbfsDev, plist.pentry[i].sector)) { part_fs = fs; part_idx = 1; goto found; } } } else { for (x=0; x<PART_FS_NUM; x++) { fs = PART_FS_FIRST + x; char *fsname = get_fs_name(fs); int len = strlen(fsname); if (strncasecmp(partition, fsname, len) == 0) { int idx = atoi(partition + len); if (idx < 1 || idx > 9) goto err; i = PartList_FindFS(&plist, fs, idx, NULL); if (i >= 0) { part_fs = fs; part_idx = idx; goto found; } } } } // nothing found goto err; found: if (i >= plist.num) goto err; // set partition lba sector part_lba = plist.pentry[i].sector; if (WBFS_OpenPart(part_fs, part_idx, part_lba, plist.pentry[i].size, partition)) { goto err; } // success dbg_printf("OK! partition=%s\n", partition); return 0; err: Gui_Console_Enable(); printf(gt("Invalid partition: '%s'"), partition); printf("\n"); __console_flush(0); sleep(2); return -1; }