static int ethNeedsUpdate(void) { int result = 0; if (gNetworkStartup == 0) { fio_stat_t stat; char path[255]; sprintf(path, "%sCD", ethPrefix); if (fioGetstat(path, &stat) != 0) memset(stat.mtime, 0, 8); if (memcmp(ethModifiedCDPrev, stat.mtime, 8)) { memcpy(ethModifiedCDPrev, stat.mtime, 8); result = 1; } sprintf(path, "%sDVD", ethPrefix); if (fioGetstat(path, &stat) != 0) memset(stat.mtime, 0, 8); if (memcmp(ethModifiedDVDPrev, stat.mtime, 8)) { memcpy(ethModifiedDVDPrev, stat.mtime, 8); result = 1; } if (!sbIsSameSize(ethPrefix, ethULSizePrev)) result = 1; } return result; }
int createZIP(gameSave_t *save, device_t src) { FILE *mcFile; zipFile zf; zip_fileinfo zfi; sceMcTblGetDir mcDir[64] __attribute__((aligned(64))); fio_stat_t stat; char mcPath[100]; char zipPath[100]; char filePath[150]; char validName[32]; char *data; int i; int ret; float progress = 0.0; if(!save || !(src & (MC_SLOT_1|MC_SLOT_2))) return 0; replaceIllegalChars(save->name, validName, '-'); rtrim(validName); snprintf(zipPath, 100, "%s%s.zip", flashDriveDevice, validName); if(fioGetstat(zipPath, &stat) == 0) { const char *items[] = {"Yes", "No"}; int choice = displayPromptMenu(items, 2, "Save already exists. Do you want to overwrite it?"); if(choice == 1) return 0; } zf = zipOpen(zipPath, APPEND_STATUS_CREATE); if(!zf) return 0; snprintf(mcPath, 100, "%s/*", strstr(save->path, ":") + 1); mcGetDir((src == MC_SLOT_1) ? 0 : 1, 0, mcPath, 0, 54, mcDir); mcSync(0, NULL, &ret); for(i = 0; i < ret; i++) { if(mcDir[i].AttrFile & MC_ATTR_SUBDIR) continue; else if(mcDir[i].AttrFile & MC_ATTR_FILE) { progress += (float)1/(ret-2); drawCopyProgress(progress); snprintf(filePath, 100, "%s/%s", save->path, mcDir[i].EntryName); mcFile = fopen(filePath, "rb"); data = malloc(mcDir[i].FileSizeByte); fread(data, 1, mcDir[i].FileSizeByte, mcFile); fclose(mcFile); if(zipOpenNewFileInZip(zf, strstr(filePath, ":") + 1, &zfi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_BEST_COMPRESSION) == ZIP_OK) { zipWriteInFileInZip(zf, data, mcDir[i].FileSizeByte); zipCloseFileInZip(zf); } else { zipClose(zf, NULL); free(data); return 0; } free(data); } } zipClose(zf, NULL); return 1; }
int createPSU(gameSave_t *save, device_t src) { FILE *psuFile, *mcFile; sceMcTblGetDir mcDir[64] __attribute__((aligned(64))); McFsEntry dir, file; fio_stat_t stat; char mcPath[100]; char psuPath[100]; char filePath[150]; char validName[32]; char *data; int numFiles = 0; int i, j, padding; int ret; float progress = 0.0; if(!save || !(src & (MC_SLOT_1|MC_SLOT_2))) return 0; memset(&dir, 0, sizeof(McFsEntry)); memset(&file, 0, sizeof(McFsEntry)); replaceIllegalChars(save->name, validName, '-'); rtrim(validName); snprintf(psuPath, 100, "%s%s.psu", flashDriveDevice, validName); if(fioGetstat(psuPath, &stat) == 0) { const char *items[] = {"Yes", "No"}; int choice = displayPromptMenu(items, 2, "Save already exists. Do you want to overwrite it?"); if(choice == 1) return 0; } psuFile = fopen(psuPath, "wb"); if(!psuFile) return 0; snprintf(mcPath, 100, "%s/*", strstr(save->path, ":") + 1); mcGetDir((src == MC_SLOT_1) ? 0 : 1, 0, mcPath, 0, 54, mcDir); mcSync(0, NULL, &ret); // Leave space for 3 directory entries (root, '.', and '..'). for(i = 0; i < 512*3; i++) fputc(0, psuFile); for(i = 0; i < ret; i++) { if(mcDir[i].AttrFile & MC_ATTR_SUBDIR) { dir.mode = 0x8427; memcpy(&dir.created, &mcDir[i]._Create, sizeof(sceMcStDateTime)); memcpy(&dir.modified, &mcDir[i]._Modify, sizeof(sceMcStDateTime)); } else if(mcDir[i].AttrFile & MC_ATTR_FILE) { progress += (float)1/(ret-2); drawCopyProgress(progress); file.mode = mcDir[i].AttrFile; file.length = mcDir[i].FileSizeByte; memcpy(&file.created, &mcDir[i]._Create, sizeof(sceMcStDateTime)); memcpy(&file.modified, &mcDir[i]._Modify, sizeof(sceMcStDateTime)); strncpy(file.name, mcDir[i].EntryName, 32); snprintf(filePath, 100, "%s/%s", save->path, file.name); mcFile = fopen(filePath, "rb"); data = malloc(file.length); fread(data, 1, file.length, mcFile); fclose(mcFile); fwrite(&file, 1, 512, psuFile); fwrite(data, 1, file.length, psuFile); free(data); numFiles++; padding = 1024 - (file.length % 1024); if(padding < 1024) { for(j = 0; j < padding; j++) fputc(0, psuFile); } } } fseek(psuFile, 0, SEEK_SET); dir.length = numFiles + 2; strncpy(dir.name, strstr(save->path, ":") + 1, 32); fwrite(&dir, 1, 512, psuFile); // root directory dir.length = 0; strncpy(dir.name, ".", 32); fwrite(&dir, 1, 512, psuFile); // . strncpy(dir.name, "..", 32); fwrite(&dir, 1, 512, psuFile); // .. fclose(psuFile); return 1; }