mirror of
https://github.com/d0k3/GodMode9.git
synced 2025-06-26 21:52:48 +00:00
Improved virtual file handling
This commit is contained in:
parent
943759bee9
commit
049b6b0ea0
24
source/fs.c
24
source/fs.c
@ -213,7 +213,7 @@ bool CheckWritePermissions(const char* path) {
|
||||
snprintf(area_name, 16, "the SysNAND");
|
||||
// check virtual file flags (if any)
|
||||
VirtualFile vfile;
|
||||
if (FindVirtualFile(&vfile, path, 0) && (vfile.flags & VFLAG_A9LH_AREA)) {
|
||||
if (GetVirtualFile(&vfile, path) && (vfile.flags & VFLAG_A9LH_AREA)) {
|
||||
perm = PERM_A9LH;
|
||||
snprintf(area_name, 16, "A9LH regions");
|
||||
}
|
||||
@ -351,7 +351,7 @@ bool FileSetData(const char* path, const u8* data, size_t size, size_t foffset,
|
||||
return (bytes_written == size);
|
||||
} else if (drvtype & DRV_VIRTUAL) {
|
||||
VirtualFile vfile;
|
||||
if (!FindVirtualFile(&vfile, path, 0))
|
||||
if (!GetVirtualFile(&vfile, path))
|
||||
return 0;
|
||||
return (WriteVirtualFile(&vfile, data, foffset, size, NULL) == 0);
|
||||
}
|
||||
@ -375,7 +375,7 @@ size_t FileGetData(const char* path, u8* data, size_t size, size_t foffset) {
|
||||
} else if (drvtype & DRV_VIRTUAL) {
|
||||
u32 bytes_read = 0;
|
||||
VirtualFile vfile;
|
||||
if (!FindVirtualFile(&vfile, path, 0))
|
||||
if (!GetVirtualFile(&vfile, path))
|
||||
return 0;
|
||||
return (ReadVirtualFile(&vfile, data, foffset, size, &bytes_read) == 0) ? bytes_read : 0;
|
||||
}
|
||||
@ -391,7 +391,7 @@ size_t FileGetSize(const char* path) {
|
||||
return fno.fsize;
|
||||
} else if (drvtype & DRV_VIRTUAL) {
|
||||
VirtualFile vfile;
|
||||
if (!FindVirtualFile(&vfile, path, 0))
|
||||
if (!GetVirtualFile(&vfile, path))
|
||||
return 0;
|
||||
return vfile.size;
|
||||
}
|
||||
@ -407,7 +407,7 @@ bool FileGetSha256(const char* path, u8* sha256) {
|
||||
VirtualFile vfile;
|
||||
u32 fsize;
|
||||
|
||||
if (!FindVirtualFile(&vfile, path, 0))
|
||||
if (!GetVirtualFile(&vfile, path))
|
||||
return false;
|
||||
fsize = vfile.size;
|
||||
|
||||
@ -497,7 +497,7 @@ bool FileInjectFile(const char* dest, const char* orig, u32 offset) {
|
||||
// open destination
|
||||
if (DriveType(dest) & DRV_VIRTUAL) {
|
||||
vdest = true;
|
||||
if (!FindVirtualFile(&dvfile, dest, 0))
|
||||
if (!GetVirtualFile(&dvfile, dest))
|
||||
return false;
|
||||
dsize = dvfile.size;
|
||||
} else {
|
||||
@ -512,7 +512,7 @@ bool FileInjectFile(const char* dest, const char* orig, u32 offset) {
|
||||
// open origin
|
||||
if (DriveType(orig) & DRV_VIRTUAL) {
|
||||
vorig = true;
|
||||
if (!FindVirtualFile(&ovfile, orig, 0)) {
|
||||
if (!GetVirtualFile(&ovfile, orig)) {
|
||||
if (!vdest) f_close(&dfile);
|
||||
return false;
|
||||
}
|
||||
@ -582,9 +582,9 @@ bool PathCopyVirtual(const char* destdir, const char* orig, u32* flags) {
|
||||
VirtualFile ovfile;
|
||||
u32 osize;
|
||||
|
||||
if (!FindVirtualFile(&dvfile, dest, 0))
|
||||
if (!GetVirtualFile(&dvfile, dest))
|
||||
return false;
|
||||
if (!FindVirtualFile(&ovfile, orig, 0))
|
||||
if (!GetVirtualFile(&ovfile, orig))
|
||||
return false;
|
||||
osize = ovfile.size;
|
||||
if (dvfile.size != osize) { // almost impossible, but so what...
|
||||
@ -621,8 +621,8 @@ bool PathCopyVirtual(const char* destdir, const char* orig, u32* flags) {
|
||||
f_lseek(&ofile, 0);
|
||||
f_sync(&ofile);
|
||||
osize = f_size(&ofile);
|
||||
if (!FindVirtualFile(&dvfile, dest, 0)) {
|
||||
if (!FindVirtualFile(&dvfile, dest, osize)) {
|
||||
if (!GetVirtualFile(&dvfile, dest)) {
|
||||
if (!FindVirtualFileBySize(&dvfile, dest, osize)) {
|
||||
f_close(&ofile);
|
||||
return false;
|
||||
}
|
||||
@ -669,7 +669,7 @@ bool PathCopyVirtual(const char* destdir, const char* orig, u32* flags) {
|
||||
FIL dfile;
|
||||
u32 osize;
|
||||
|
||||
if (!FindVirtualFile(&ovfile, orig, 0))
|
||||
if (!GetVirtualFile(&ovfile, orig))
|
||||
return false;
|
||||
|
||||
// check if destination exists
|
||||
|
@ -233,7 +233,7 @@ u32 SdFormatMenu(void) {
|
||||
}
|
||||
|
||||
VirtualFile nand;
|
||||
if (!FindVirtualFile(&nand, "S:/nand_minsize.bin", 0))
|
||||
if (!GetVirtualFile(&nand, "S:/nand_minsize.bin"))
|
||||
return 0;
|
||||
if ((nand.size / (1024*1024) <= emunand_size_mb) && ShowPrompt(true, "Clone SysNAND to RedNAND now?")) {
|
||||
if (!PathCopy("E:", "S:/nand_minsize.bin", NULL))
|
||||
|
@ -35,7 +35,7 @@ bool ReadVirtualDir(VirtualFile* vfile, u32 virtual_src) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FindVirtualFile(VirtualFile* vfile, const char* path, u32 size) {
|
||||
bool GetVirtualFile(VirtualFile* vfile, const char* path) {
|
||||
// get / fix the name
|
||||
char* fname = strchr(path, '/');
|
||||
if (!fname) return false;
|
||||
@ -51,12 +51,29 @@ bool FindVirtualFile(VirtualFile* vfile, const char* path, u32 size) {
|
||||
ReadVirtualDir(NULL, virtual_src); // reset dir reader
|
||||
while (ReadVirtualDir(vfile, virtual_src)) {
|
||||
vfile->flags |= virtual_src; // add source flag
|
||||
if (((strncasecmp(fname, vfile->name, 32) == 0) ||
|
||||
(size && (vfile->size == size)))) // search by size should be a last resort solution
|
||||
if (strncasecmp(fname, vfile->name, 32) == 0)
|
||||
return true; // file found
|
||||
}
|
||||
|
||||
// failed if arriving
|
||||
// failed if arriving here
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FindVirtualFileBySize(VirtualFile* vfile, const char* path, u32 size) {
|
||||
// get virtual source
|
||||
u32 virtual_src = 0;
|
||||
virtual_src = GetVirtualSource(path);
|
||||
if (!virtual_src) return false;
|
||||
|
||||
// read virtual dir, match the path / size
|
||||
ReadVirtualDir(NULL, virtual_src); // reset dir reader
|
||||
while (ReadVirtualDir(vfile, virtual_src)) {
|
||||
vfile->flags |= virtual_src; // add source flag
|
||||
if (vfile->size == size) // search by size should be a last resort solution
|
||||
return true; // file found
|
||||
}
|
||||
|
||||
// failed if arriving here
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -26,7 +26,8 @@ typedef struct {
|
||||
|
||||
u32 GetVirtualSource(const char* path);
|
||||
bool CheckVirtualDrive(const char* path);
|
||||
bool FindVirtualFile(VirtualFile* vfile, const char* path, u32 size);
|
||||
bool GetVirtualFile(VirtualFile* vfile, const char* path);
|
||||
bool FindVirtualFileBySize(VirtualFile* vfile, const char* path, u32 size);
|
||||
bool GetVirtualDirContents(DirStruct* contents, const char* path, const char* pattern);
|
||||
int ReadVirtualFile(const VirtualFile* vfile, u8* buffer, u32 offset, u32 count, u32* bytes_read);
|
||||
int WriteVirtualFile(const VirtualFile* vfile, const u8* buffer, u32 offset, u32 count, u32* bytes_written);
|
||||
|
Loading…
x
Reference in New Issue
Block a user