int Partition_FindFS(u32 device, int part_fstype, int seq_i, sec_t *sector) { int ret; PartList plist; //dbg_printf("Part_Find(%d, %d, %d)\n", device, part_fstype, seq_i); if (seq_i <= 0) return -2; // index has to start with 1 ret = Partition_GetList(device, &plist); if (ret < 0) return ret; ret = PartList_FindFS(&plist, part_fstype, seq_i, sector); if (ret < 0) return ret; return 0; }
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; }