1
0
Fork 0
mirror of https://github.com/DarkMatterCore/nxdumptool.git synced 2024-11-26 12:12:02 +00:00

Commit filesystem changes when needed.

This commit is contained in:
Pablo Curiel 2020-08-01 00:43:55 -04:00
parent b11df5e732
commit 64f3a566f8
2 changed files with 85 additions and 44 deletions

View file

@ -60,6 +60,8 @@ static const u32 g_sizeSuffixesCount = MAX_ELEMENTS(g_sizeSuffixes);
static bool utilsMountEmmcBisSystemPartitionStorage(void);
static void utilsUnmountEmmcBisSystemPartitionStorage(void);
static bool utilsGetDeviceFileSystemAndFilePathFromAbsolutePath(const char *path, FsFileSystem **out_fs, char **out_filepath);
static void _utilsGetCustomFirmwareType(void);
static void utilsOverclockSystemAppletHook(AppletHookType hook, void *param);
@ -71,6 +73,13 @@ bool utilsInitializeResources(void)
bool ret = g_resourcesInitialized;
if (ret) goto end;
/* Retrieve pointer to the SD card FsFileSystem element. */
if (!(g_sdCardFileSystem = fsdevGetDeviceFileSystem("sdmc:")))
{
LOGFILE("Failed to retrieve FsFileSystem from SD card!");
goto end;
}
/* Initialize needed services. */
if (!servicesInitialize())
{
@ -113,13 +122,6 @@ bool utilsInitializeResources(void)
goto end;
}
/* Retrieve SD card FsFileSystem element. */
if (!(g_sdCardFileSystem = fsdevGetDeviceFileSystem("sdmc:")))
{
LOGFILE("fsdevGetDeviceFileSystem failed!");
goto end;
}
/* Mount eMMC BIS System partition. */
if (!utilsMountEmmcBisSystemPartitionStorage()) goto end;
@ -199,38 +201,27 @@ void utilsCloseResources(void)
u64 utilsHidKeysAllDown(void)
{
u8 controller;
u64 keys_down = 0;
for(controller = 0; controller < (u8)CONTROLLER_P1_AUTO; controller++) keys_down |= hidKeysDown((HidControllerID)controller);
for(u32 i = 0; i < CONTROLLER_UNKNOWN; i++) keys_down |= hidKeysDown(i);
return keys_down;
}
u64 utilsHidKeysAllHeld(void)
{
u8 controller;
u64 keys_held = 0;
for(controller = 0; controller < (u8)CONTROLLER_P1_AUTO; controller++) keys_held |= hidKeysHeld((HidControllerID)controller);
for(u32 i = 0; i < CONTROLLER_UNKNOWN; i++) keys_held |= hidKeysHeld(i);
return keys_held;
}
void utilsWaitForButtonPress(u64 flag)
{
u64 keys_down = 0;
if (!flag)
{
/* Don't consider touch screen presses nor stick movement as button inputs. */
flag = ~(KEY_TOUCH | KEY_LSTICK_LEFT | KEY_LSTICK_RIGHT | KEY_LSTICK_UP | KEY_LSTICK_DOWN | KEY_RSTICK_LEFT | KEY_RSTICK_RIGHT | KEY_RSTICK_UP | KEY_RSTICK_DOWN);
}
/* Don't consider touch screen presses nor stick movement as button inputs. */
if (!flag) flag = ~(KEY_TOUCH | KEY_LSTICK_LEFT | KEY_LSTICK_RIGHT | KEY_LSTICK_UP | KEY_LSTICK_DOWN | KEY_RSTICK_LEFT | KEY_RSTICK_RIGHT | KEY_RSTICK_UP | KEY_RSTICK_DOWN);
while(appletMainLoop())
{
hidScanInput();
keys_down = utilsHidKeysAllDown();
u64 keys_down = utilsHidKeysAllDown();
if (keys_down & flag) break;
}
}
@ -258,6 +249,7 @@ void utilsWriteMessageToLogFile(const char *func_name, const char *fmt, ...)
fprintf(logfile, "\r\n");
fclose(logfile);
utilsCommitSdCardFileSystemChanges();
end:
mutexUnlock(&g_logfileMutex);
@ -296,6 +288,7 @@ void utilsWriteLogBufferToLogFile(const char *src)
fprintf(logfile, "%s", src);
fclose(logfile);
utilsCommitSdCardFileSystemChanges();
end:
mutexUnlock(&g_logfileMutex);
@ -380,27 +373,54 @@ void utilsGenerateFormattedSizeString(u64 size, char *dst, size_t dst_size)
}
}
bool utilsGetFreeSdCardSpace(u64 *out)
bool utilsGetFreeSpaceFromFileSystem(FsFileSystem *fs, u64 *out)
{
return utilsGetFreeFileSystemSpace(g_sdCardFileSystem, out);
}
bool utilsGetFreeFileSystemSpace(FsFileSystem *fs, u64 *out)
{
if (!fs || !out)
if (!fs || !serviceIsActive(&(fs->s)) || !out)
{
LOGFILE("Invalid parameters!");
return false;
}
Result rc = fsFsGetFreeSpace(fs, "/", (s64*)out);
if (R_FAILED(rc))
if (R_FAILED(rc)) LOGFILE("fsFsGetFreeSpace failed! (0x%08X).", rc);
return R_SUCCEEDED(rc);
}
bool utilsGetFreeSpaceFromFileSystemByPath(const char *path, u64 *out)
{
FsFileSystem *fs = NULL;
if (!utilsGetDeviceFileSystemAndFilePathFromAbsolutePath(path, &fs, NULL) || !out)
{
LOGFILE("fsFsGetFreeSpace failed! (0x%08X).", rc);
LOGFILE("Invalid parameters!");
return false;
}
return true;
return utilsGetFreeSpaceFromFileSystem(fs, out);
}
bool utilsGetFreeSdCardFileSystemSpace(u64 *out)
{
return utilsGetFreeSpaceFromFileSystem(g_sdCardFileSystem, out);
}
bool utilsCommitFileSystemChangesByPath(const char *path)
{
Result rc = 0;
FsFileSystem *fs = NULL;
if (!utilsGetDeviceFileSystemAndFilePathFromAbsolutePath(path, &fs, NULL)) return false;
rc = fsFsCommit(fs);
return R_SUCCEEDED(rc);
}
bool utilsCommitSdCardFileSystemChanges(void)
{
if (!g_sdCardFileSystem) return false;
Result rc = fsFsCommit(g_sdCardFileSystem);
return R_SUCCEEDED(rc);
}
bool utilsCheckIfFileExists(const char *path)
@ -419,8 +439,6 @@ bool utilsCheckIfFileExists(const char *path)
bool utilsCreateConcatenationFile(const char *path)
{
Result rc = 0;
if (!path || !strlen(path))
{
LOGFILE("Invalid parameters!");
@ -433,14 +451,12 @@ bool utilsCreateConcatenationFile(const char *path)
/* Create ConcatenationFile */
/* If the call succeeds, the caller function will be able to operate on this file using stdio calls. */
rc = fsdevCreateFile(path, 0, FsCreateOption_BigFile);
if (R_FAILED(rc))
{
LOGFILE("fsdevCreateFile failed for \"%s\"! (0x%08X).", path, rc);
return false;
}
Result rc = fsdevCreateFile(path, 0, FsCreateOption_BigFile);
if (R_FAILED(rc)) LOGFILE("fsdevCreateFile failed for \"%s\"! (0x%08X).", path, rc);
return true;
utilsCommitFileSystemChangesByPath(path);
return R_SUCCEEDED(rc);
}
void utilsCreateDirectoryTree(const char *path, bool create_last_element)
@ -464,6 +480,8 @@ void utilsCreateDirectoryTree(const char *path, bool create_last_element)
if (create_last_element) mkdir(path, 0777);
free(tmp);
utilsCommitFileSystemChangesByPath(path);
}
bool utilsAppletModeCheck(void)
@ -553,6 +571,25 @@ static void utilsUnmountEmmcBisSystemPartitionStorage(void)
}
}
static bool utilsGetDeviceFileSystemAndFilePathFromAbsolutePath(const char *path, FsFileSystem **out_fs, char **out_filepath)
{
FsFileSystem *fs = NULL;
char *name_end = NULL, *filepath = NULL, name[32] = {0};
if (!path || !strlen(path) || !(name_end = strchr(path, ':')) || (size_t)(name_end - path) >= MAX_ELEMENTS(name) || (!out_fs && !out_filepath) || \
(out_filepath && *(filepath = (name_end + 1)) != '/')) return false;
sprintf(name, "%.*s", (int)(name_end - path), path);
fs = fsdevGetDeviceFileSystem(name);
if (!fs) return false;
if (out_fs) *out_fs = fs;
if (out_filepath) *out_filepath = filepath;
return true;
}
static void _utilsGetCustomFirmwareType(void)
{
bool tx_srv = servicesCheckRunningServiceByName("tx");

View file

@ -95,8 +95,12 @@ void utilsGenerateHexStringFromData(char *dst, size_t dst_size, const void *src,
void utilsGenerateFormattedSizeString(u64 size, char *dst, size_t dst_size);
bool utilsGetFreeSdCardSpace(u64 *out);
bool utilsGetFreeFileSystemSpace(FsFileSystem *fs, u64 *out);
bool utilsGetFreeSpaceFromFileSystem(FsFileSystem *fs, u64 *out);
bool utilsGetFreeSpaceFromFileSystemByPath(const char *path, u64 *out);
bool utilsGetFreeSdCardFileSystemSpace(u64 *out);
bool utilsCommitFileSystemChangesByPath(const char *path);
bool utilsCommitSdCardFileSystemChanges(void);
bool utilsCheckIfFileExists(const char *path);