Improved virtual file handling

This commit is contained in:
d0k3 2016-11-15 23:34:21 +01:00
parent 943759bee9
commit 049b6b0ea0
4 changed files with 36 additions and 18 deletions

View File

@ -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

View File

@ -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))

View File

@ -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;
} }

View File

@ -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);