int has_directories(const char *base, const char *path) { SceIoDirent dir; char buffer[256]; int ret = 0; SceUID fd; sce_paf_private_snprintf(buffer, 256, "%s/%s", base, path); kprintf("checking %s\n", buffer); fd = sceIoDopen(buffer); if(fd >= 0) { sce_paf_private_memset(&dir, 0, sizeof(SceIoDirent)); while(sceIoDread(fd, &dir) > 0) { if (FIO_S_ISDIR(dir.d_stat.st_mode) && dir.d_name[0] != '.') { ret = 1; break; } } sceIoDclose(fd); } else { ret = -1; } return ret; }
void testSet() { u8 data1[1024], data2[1024]; u8 *result; printf("sce_paf_private_memset:\n"); resetData(data1, data2); result = sce_paf_private_memset(data1, 2, 256); printf("2: %d vs %d, %d\n", checksumData(data1), checksumData(data2), result == data1); resetData(data1, data2); result = sce_paf_private_memset(data1, 255, 1); printf("255: %d vs %d, %d\n", checksumData(data1), checksumData(data2), result == data1); resetData(data1, data2); result = sce_paf_private_memset(data1, 1024, 1); printf("1024: %d vs %d, %d\n", checksumData(data1), checksumData(data2), result == data1); resetData(data1, data2); result = sce_paf_private_memset(data1, 255, 0); printf("0 bytes long: %d vs %d, %d\n", checksumData(data1), checksumData(data2), result == data1); printf("NULL 0 bytes long: %08X\n", (unsigned int) sce_paf_private_memset(NULL, 1024, 0)); printf("Invalid 0 bytes long: %08X\n", (unsigned int) sce_paf_private_memset((u8 *) 0xDEADBEEF, 1024, 0)); }
int is_game_folder(const char *base, const char *path) { SceIoStat stat; char buffer[256]; for(u32 i = 0; i < ITEMSOF(eboot_types); i++) { sce_paf_private_memset(&stat, 0 , sizeof(SceIoStat)); sce_paf_private_snprintf(buffer, 256, "%s/%s/%s", base, path, eboot_types[i]); if(sceIoGetstat(buffer, &stat) >= 0) { return 1; } } return 0; }
void IndexCategories(Category *head[], const char *path, int location) { SceIoDirent dir; SceUID fd; u64 mtime; char full_path[16]; int match; sce_paf_private_strcpy(full_path, path); SET_DEVICENAME(full_path, location); if((fd = sceIoDopen(full_path)) < 0) { return; } kprintf("Indexing categories from %s, loc: %i\n", path, location); match = 0; sce_paf_private_memset(&dir, 0, sizeof(SceIoDirent)); while(1) { if(sceIoDread(fd, &dir) <= 0) { kprintf("End of directory list\n"); sceIoDclose(fd); break; } kprintf("checking [%s], length: %i\n", dir.d_name, sce_paf_private_strlen(dir.d_name)); if (FIO_S_ISDIR(dir.d_stat.st_mode) && dir.d_name[0] != '.') { if(!config.prefix && !is_game_folder(full_path, dir.d_name)) { if(has_directories(full_path, dir.d_name) > 0) { match = 1; } } else if(config.prefix && sce_paf_private_strncmp(dir.d_name, "CAT_", 4) == 0) { if(has_directories(full_path, dir.d_name) > 0) { sce_paf_private_strcpy(dir.d_name, dir.d_name + 4); match = 1; } } if(match) { match = 0; sceRtcGetTick((pspTime *) &dir.d_stat.st_mtime, &mtime); kprintf("Adding category: [%s]\n", dir.d_name); AddCategory(head, dir.d_name, mtime, location); } } } }