mirror of
https://github.com/d0k3/GodMode9.git
synced 2025-06-26 13:42:47 +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");
|
snprintf(area_name, 16, "the SysNAND");
|
||||||
// check virtual file flags (if any)
|
// check virtual file flags (if any)
|
||||||
VirtualFile vfile;
|
VirtualFile vfile;
|
||||||
if (FindVirtualFile(&vfile, path, 0) && (vfile.flags & VFLAG_A9LH_AREA)) {
|
if (GetVirtualFile(&vfile, path) && (vfile.flags & VFLAG_A9LH_AREA)) {
|
||||||
perm = PERM_A9LH;
|
perm = PERM_A9LH;
|
||||||
snprintf(area_name, 16, "A9LH regions");
|
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);
|
return (bytes_written == size);
|
||||||
} else if (drvtype & DRV_VIRTUAL) {
|
} else if (drvtype & DRV_VIRTUAL) {
|
||||||
VirtualFile vfile;
|
VirtualFile vfile;
|
||||||
if (!FindVirtualFile(&vfile, path, 0))
|
if (!GetVirtualFile(&vfile, path))
|
||||||
return 0;
|
return 0;
|
||||||
return (WriteVirtualFile(&vfile, data, foffset, size, NULL) == 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) {
|
} else if (drvtype & DRV_VIRTUAL) {
|
||||||
u32 bytes_read = 0;
|
u32 bytes_read = 0;
|
||||||
VirtualFile vfile;
|
VirtualFile vfile;
|
||||||
if (!FindVirtualFile(&vfile, path, 0))
|
if (!GetVirtualFile(&vfile, path))
|
||||||
return 0;
|
return 0;
|
||||||
return (ReadVirtualFile(&vfile, data, foffset, size, &bytes_read) == 0) ? bytes_read : 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;
|
return fno.fsize;
|
||||||
} else if (drvtype & DRV_VIRTUAL) {
|
} else if (drvtype & DRV_VIRTUAL) {
|
||||||
VirtualFile vfile;
|
VirtualFile vfile;
|
||||||
if (!FindVirtualFile(&vfile, path, 0))
|
if (!GetVirtualFile(&vfile, path))
|
||||||
return 0;
|
return 0;
|
||||||
return vfile.size;
|
return vfile.size;
|
||||||
}
|
}
|
||||||
@ -407,7 +407,7 @@ bool FileGetSha256(const char* path, u8* sha256) {
|
|||||||
VirtualFile vfile;
|
VirtualFile vfile;
|
||||||
u32 fsize;
|
u32 fsize;
|
||||||
|
|
||||||
if (!FindVirtualFile(&vfile, path, 0))
|
if (!GetVirtualFile(&vfile, path))
|
||||||
return false;
|
return false;
|
||||||
fsize = vfile.size;
|
fsize = vfile.size;
|
||||||
|
|
||||||
@ -497,7 +497,7 @@ bool FileInjectFile(const char* dest, const char* orig, u32 offset) {
|
|||||||
// open destination
|
// open destination
|
||||||
if (DriveType(dest) & DRV_VIRTUAL) {
|
if (DriveType(dest) & DRV_VIRTUAL) {
|
||||||
vdest = true;
|
vdest = true;
|
||||||
if (!FindVirtualFile(&dvfile, dest, 0))
|
if (!GetVirtualFile(&dvfile, dest))
|
||||||
return false;
|
return false;
|
||||||
dsize = dvfile.size;
|
dsize = dvfile.size;
|
||||||
} else {
|
} else {
|
||||||
@ -512,7 +512,7 @@ bool FileInjectFile(const char* dest, const char* orig, u32 offset) {
|
|||||||
// open origin
|
// open origin
|
||||||
if (DriveType(orig) & DRV_VIRTUAL) {
|
if (DriveType(orig) & DRV_VIRTUAL) {
|
||||||
vorig = true;
|
vorig = true;
|
||||||
if (!FindVirtualFile(&ovfile, orig, 0)) {
|
if (!GetVirtualFile(&ovfile, orig)) {
|
||||||
if (!vdest) f_close(&dfile);
|
if (!vdest) f_close(&dfile);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -582,9 +582,9 @@ bool PathCopyVirtual(const char* destdir, const char* orig, u32* flags) {
|
|||||||
VirtualFile ovfile;
|
VirtualFile ovfile;
|
||||||
u32 osize;
|
u32 osize;
|
||||||
|
|
||||||
if (!FindVirtualFile(&dvfile, dest, 0))
|
if (!GetVirtualFile(&dvfile, dest))
|
||||||
return false;
|
return false;
|
||||||
if (!FindVirtualFile(&ovfile, orig, 0))
|
if (!GetVirtualFile(&ovfile, orig))
|
||||||
return false;
|
return false;
|
||||||
osize = ovfile.size;
|
osize = ovfile.size;
|
||||||
if (dvfile.size != osize) { // almost impossible, but so what...
|
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_lseek(&ofile, 0);
|
||||||
f_sync(&ofile);
|
f_sync(&ofile);
|
||||||
osize = f_size(&ofile);
|
osize = f_size(&ofile);
|
||||||
if (!FindVirtualFile(&dvfile, dest, 0)) {
|
if (!GetVirtualFile(&dvfile, dest)) {
|
||||||
if (!FindVirtualFile(&dvfile, dest, osize)) {
|
if (!FindVirtualFileBySize(&dvfile, dest, osize)) {
|
||||||
f_close(&ofile);
|
f_close(&ofile);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -669,7 +669,7 @@ bool PathCopyVirtual(const char* destdir, const char* orig, u32* flags) {
|
|||||||
FIL dfile;
|
FIL dfile;
|
||||||
u32 osize;
|
u32 osize;
|
||||||
|
|
||||||
if (!FindVirtualFile(&ovfile, orig, 0))
|
if (!GetVirtualFile(&ovfile, orig))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// check if destination exists
|
// check if destination exists
|
||||||
|
@ -233,7 +233,7 @@ u32 SdFormatMenu(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
VirtualFile nand;
|
VirtualFile nand;
|
||||||
if (!FindVirtualFile(&nand, "S:/nand_minsize.bin", 0))
|
if (!GetVirtualFile(&nand, "S:/nand_minsize.bin"))
|
||||||
return 0;
|
return 0;
|
||||||
if ((nand.size / (1024*1024) <= emunand_size_mb) && ShowPrompt(true, "Clone SysNAND to RedNAND now?")) {
|
if ((nand.size / (1024*1024) <= emunand_size_mb) && ShowPrompt(true, "Clone SysNAND to RedNAND now?")) {
|
||||||
if (!PathCopy("E:", "S:/nand_minsize.bin", NULL))
|
if (!PathCopy("E:", "S:/nand_minsize.bin", NULL))
|
||||||
|
@ -35,7 +35,7 @@ bool ReadVirtualDir(VirtualFile* vfile, u32 virtual_src) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FindVirtualFile(VirtualFile* vfile, const char* path, u32 size) {
|
bool GetVirtualFile(VirtualFile* vfile, const char* path) {
|
||||||
// get / fix the name
|
// get / fix the name
|
||||||
char* fname = strchr(path, '/');
|
char* fname = strchr(path, '/');
|
||||||
if (!fname) return false;
|
if (!fname) return false;
|
||||||
@ -51,12 +51,29 @@ bool FindVirtualFile(VirtualFile* vfile, const char* path, u32 size) {
|
|||||||
ReadVirtualDir(NULL, virtual_src); // reset dir reader
|
ReadVirtualDir(NULL, virtual_src); // reset dir reader
|
||||||
while (ReadVirtualDir(vfile, virtual_src)) {
|
while (ReadVirtualDir(vfile, virtual_src)) {
|
||||||
vfile->flags |= virtual_src; // add source flag
|
vfile->flags |= virtual_src; // add source flag
|
||||||
if (((strncasecmp(fname, vfile->name, 32) == 0) ||
|
if (strncasecmp(fname, vfile->name, 32) == 0)
|
||||||
(size && (vfile->size == size)))) // search by size should be a last resort solution
|
|
||||||
return true; // file found
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,7 +26,8 @@ typedef struct {
|
|||||||
|
|
||||||
u32 GetVirtualSource(const char* path);
|
u32 GetVirtualSource(const char* path);
|
||||||
bool CheckVirtualDrive(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);
|
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 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);
|
int WriteVirtualFile(const VirtualFile* vfile, const u8* buffer, u32 offset, u32 count, u32* bytes_written);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user