mirror of
https://github.com/DarkMatterCore/nxdumptool.git
synced 2024-11-26 04:02:11 +00:00
poc: add file browser for NCA FS sections.
Takes advantage of the recently implemented devoptab interfaces. Supports individual file dumping and multiple file/dir dumping via highlighting. May possibly need some additional testing. The code could potentially be improved, but I'll look into it at a later time -- I just want to release this now. Other changes include: * devoptab: comment out log messages. * utils: add utilsGetDirectorySize() function.
This commit is contained in:
parent
7a0268eeb0
commit
c585e8f9d3
6 changed files with 1182 additions and 89 deletions
File diff suppressed because it is too large
Load diff
|
@ -157,6 +157,10 @@ bool utilsCreateConcatenationFile(const char *path);
|
||||||
/// If 'create_last_element' is true, the last element from the provided path will be created as well.
|
/// If 'create_last_element' is true, the last element from the provided path will be created as well.
|
||||||
void utilsCreateDirectoryTree(const char *path, bool create_last_element);
|
void utilsCreateDirectoryTree(const char *path, bool create_last_element);
|
||||||
|
|
||||||
|
/// Calculates the size of a directory by recursively traversing all of its child entries.
|
||||||
|
/// The provided path must be absolute and it must include the virtual device name it belongs to (e.g. "sdmc:/path/to/dir").
|
||||||
|
bool utilsGetDirectorySize(const char *path, u64 *out_size);
|
||||||
|
|
||||||
/// Recursively deletes the directory located at the provided path and all of its contents.
|
/// Recursively deletes the directory located at the provided path and all of its contents.
|
||||||
/// The provided path must be absolute and it must include the virtual device name it belongs to (e.g. "sdmc:/path/to/dir").
|
/// The provided path must be absolute and it must include the virtual device name it belongs to (e.g. "sdmc:/path/to/dir").
|
||||||
bool utilsDeleteDirectoryRecursively(const char *path);
|
bool utilsDeleteDirectoryRecursively(const char *path);
|
||||||
|
|
|
@ -206,7 +206,7 @@ bool utilsInitializeResources(void)
|
||||||
/* Load keyset. */
|
/* Load keyset. */
|
||||||
if (!keysLoadKeyset())
|
if (!keysLoadKeyset())
|
||||||
{
|
{
|
||||||
LOG_MSG_ERROR("Failed to load keyset!\nPlease update your keys file with Lockpick_RCM.\nYou can get an updated build at:" DISCORD_SERVER_URL);
|
LOG_MSG_ERROR("Failed to load keyset!\nPlease update your keys file with Lockpick_RCM.\nYou can get an updated build at: " DISCORD_SERVER_URL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -813,12 +813,84 @@ void utilsCreateDirectoryTree(const char *path, bool create_last_element)
|
||||||
free(tmp);
|
free(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool utilsGetDirectorySize(const char *path, u64 *out_size)
|
||||||
|
{
|
||||||
|
u64 total_size = 0;
|
||||||
|
char *name_end = NULL, *entry_path = NULL;
|
||||||
|
DIR *dir = NULL;
|
||||||
|
struct dirent *entry = NULL;
|
||||||
|
struct stat st = {0};
|
||||||
|
bool success = false;
|
||||||
|
|
||||||
|
/* Sanity checks. */
|
||||||
|
if (!path || !*path || !(name_end = strchr(path, ':')) || *(name_end + 1) != '/' || !*(name_end + 2) || !out_size)
|
||||||
|
{
|
||||||
|
LOG_MSG_ERROR("Invalid parameters!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(dir = opendir(path)))
|
||||||
|
{
|
||||||
|
LOG_MSG_ERROR("Failed to open directory \"%s\"! (%d).", path, errno);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(entry_path = calloc(1, FS_MAX_PATH)))
|
||||||
|
{
|
||||||
|
LOG_MSG_ERROR("Failed to allocate memory for path buffer!");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read directory entries. */
|
||||||
|
while((entry = readdir(dir)))
|
||||||
|
{
|
||||||
|
/* Skip current directory and parent directory entries. */
|
||||||
|
if (!strcmp(".", entry->d_name) || !strcmp("..", entry->d_name)) continue;
|
||||||
|
|
||||||
|
/* Generate path to the current entry. */
|
||||||
|
snprintf(entry_path, FS_MAX_PATH, "%s/%s", path, entry->d_name);
|
||||||
|
|
||||||
|
if (entry->d_type == DT_DIR)
|
||||||
|
{
|
||||||
|
/* Get directory size. */
|
||||||
|
u64 dir_size = 0;
|
||||||
|
if (!utilsGetDirectorySize(entry_path, &dir_size)) goto end;
|
||||||
|
|
||||||
|
/* Update size. */
|
||||||
|
total_size += dir_size;
|
||||||
|
} else {
|
||||||
|
/* Get file properties. */
|
||||||
|
if (stat(entry_path, &st) != 0)
|
||||||
|
{
|
||||||
|
LOG_MSG_ERROR("Failed to stat file \"%s\"! (%d).", entry_path, errno);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update size. */
|
||||||
|
total_size += st.st_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update output pointer. */
|
||||||
|
*out_size = total_size;
|
||||||
|
|
||||||
|
/* Update return value. */
|
||||||
|
success = true;
|
||||||
|
|
||||||
|
end:
|
||||||
|
if (entry_path) free(entry_path);
|
||||||
|
|
||||||
|
if (dir) closedir(dir);
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
bool utilsDeleteDirectoryRecursively(const char *path)
|
bool utilsDeleteDirectoryRecursively(const char *path)
|
||||||
{
|
{
|
||||||
char *name_end = NULL, *entry_path = NULL;
|
char *name_end = NULL, *entry_path = NULL;
|
||||||
DIR *dir = NULL;
|
DIR *dir = NULL;
|
||||||
struct dirent *entry = NULL;
|
struct dirent *entry = NULL;
|
||||||
bool success = true;
|
bool success = false;
|
||||||
|
|
||||||
/* Sanity checks. */
|
/* Sanity checks. */
|
||||||
if (!path || !*path || !(name_end = strchr(path, ':')) || *(name_end + 1) != '/' || !*(name_end + 2))
|
if (!path || !*path || !(name_end = strchr(path, ':')) || *(name_end + 1) != '/' || !*(name_end + 2))
|
||||||
|
@ -830,14 +902,12 @@ bool utilsDeleteDirectoryRecursively(const char *path)
|
||||||
if (!(dir = opendir(path)))
|
if (!(dir = opendir(path)))
|
||||||
{
|
{
|
||||||
LOG_MSG_ERROR("Failed to open directory \"%s\"! (%d).", path, errno);
|
LOG_MSG_ERROR("Failed to open directory \"%s\"! (%d).", path, errno);
|
||||||
success = false;
|
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(entry_path = calloc(1, FS_MAX_PATH)))
|
if (!(entry_path = calloc(1, FS_MAX_PATH)))
|
||||||
{
|
{
|
||||||
LOG_MSG_ERROR("Failed to allocate memory for path buffer!");
|
LOG_MSG_ERROR("Failed to allocate memory for path buffer!");
|
||||||
success = false;
|
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -855,11 +925,7 @@ bool utilsDeleteDirectoryRecursively(const char *path)
|
||||||
if (entry->d_type == DT_DIR)
|
if (entry->d_type == DT_DIR)
|
||||||
{
|
{
|
||||||
/* Delete directory contents. */
|
/* Delete directory contents. */
|
||||||
if (!utilsDeleteDirectoryRecursively(entry_path))
|
if (!utilsDeleteDirectoryRecursively(entry_path)) goto end;
|
||||||
{
|
|
||||||
success = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Delete directory. */
|
/* Delete directory. */
|
||||||
status = rmdir(entry_path);
|
status = rmdir(entry_path);
|
||||||
|
@ -870,20 +936,17 @@ bool utilsDeleteDirectoryRecursively(const char *path)
|
||||||
|
|
||||||
if (status != 0)
|
if (status != 0)
|
||||||
{
|
{
|
||||||
LOG_MSG_ERROR("Failed to delete \"%s\"! (%s, %d).", entry_path, entry->d_type == DT_DIR ? "dir" : "file", errno);
|
LOG_MSG_ERROR("Failed to delete %s \"%s\"! (%d).", entry->d_type == DT_DIR ? "directory" : "file", entry_path, errno);
|
||||||
success = false;
|
goto end;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (success)
|
/* Close topmost directory so we can delete it. */
|
||||||
{
|
closedir(dir);
|
||||||
closedir(dir);
|
dir = NULL;
|
||||||
dir = NULL;
|
|
||||||
|
|
||||||
success = (rmdir(path) == 0);
|
success = (rmdir(path) == 0);
|
||||||
if (!success) LOG_MSG_ERROR("Failed to delete topmost directory \"%s\"! (%d).", path, errno);
|
if (!success) LOG_MSG_ERROR("Failed to delete topmost directory \"%s\"! (%d).", path, errno);
|
||||||
}
|
|
||||||
|
|
||||||
end:
|
end:
|
||||||
if (entry_path) free(entry_path);
|
if (entry_path) free(entry_path);
|
||||||
|
|
|
@ -119,7 +119,7 @@ static int hfsdev_open(struct _reent *r, void *fd, const char *path, int flags,
|
||||||
/* Get truncated path. */
|
/* Get truncated path. */
|
||||||
if (!(path = hfsdev_get_truncated_path(r, path))) DEVOPTAB_EXIT;
|
if (!(path = hfsdev_get_truncated_path(r, path))) DEVOPTAB_EXIT;
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Opening \"%s:/%s\" with flags 0x%X.", dev_ctx->name, path, flags);
|
//LOG_MSG_DEBUG("Opening \"%s:/%s\" with flags 0x%X.", dev_ctx->name, path, flags);
|
||||||
|
|
||||||
/* Reset file descriptor. */
|
/* Reset file descriptor. */
|
||||||
memset(file, 0, sizeof(HashFileSystemFileState));
|
memset(file, 0, sizeof(HashFileSystemFileState));
|
||||||
|
@ -140,7 +140,7 @@ static int hfsdev_close(struct _reent *r, void *fd)
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (!file) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!file) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Closing \"%s:/%s\".", dev_ctx->name, file->name);
|
//LOG_MSG_DEBUG("Closing \"%s:/%s\".", dev_ctx->name, file->name);
|
||||||
|
|
||||||
/* Reset file descriptor. */
|
/* Reset file descriptor. */
|
||||||
memset(file, 0, sizeof(HashFileSystemFileState));
|
memset(file, 0, sizeof(HashFileSystemFileState));
|
||||||
|
@ -158,7 +158,7 @@ static ssize_t hfsdev_read(struct _reent *r, void *fd, char *ptr, size_t len)
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (!file || !ptr || !len) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!file || !ptr || !len) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Reading 0x%lX byte(s) at offset 0x%lX from \"%s:/%s\".", len, file->offset, dev_ctx->name, file->name);
|
//LOG_MSG_DEBUG("Reading 0x%lX byte(s) at offset 0x%lX from \"%s:/%s\".", len, file->offset, dev_ctx->name, file->name);
|
||||||
|
|
||||||
/* Read file data. */
|
/* Read file data. */
|
||||||
if (!hfsReadEntryData(fs_ctx, file->hfs_entry, ptr, len, file->offset)) DEVOPTAB_SET_ERROR_AND_EXIT(EIO);
|
if (!hfsReadEntryData(fs_ctx, file->hfs_entry, ptr, len, file->offset)) DEVOPTAB_SET_ERROR_AND_EXIT(EIO);
|
||||||
|
@ -204,7 +204,7 @@ static off_t hfsdev_seek(struct _reent *r, void *fd, off_t pos, int dir)
|
||||||
/* Don't allow positive seeks beyond the end of file. */
|
/* Don't allow positive seeks beyond the end of file. */
|
||||||
if (offset > (off_t)file->hfs_entry->size) DEVOPTAB_SET_ERROR_AND_EXIT(EOVERFLOW);
|
if (offset > (off_t)file->hfs_entry->size) DEVOPTAB_SET_ERROR_AND_EXIT(EOVERFLOW);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Seeking to offset 0x%lX from \"%s:/%s\".", offset, dev_ctx->name, file->name);
|
//LOG_MSG_DEBUG("Seeking to offset 0x%lX from \"%s:/%s\".", offset, dev_ctx->name, file->name);
|
||||||
|
|
||||||
/* Adjust offset. */
|
/* Adjust offset. */
|
||||||
file->offset = (u64)offset;
|
file->offset = (u64)offset;
|
||||||
|
@ -221,7 +221,7 @@ static int hfsdev_fstat(struct _reent *r, void *fd, struct stat *st)
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (!file || !st) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!file || !st) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Getting file stats for \"%s:/%s\".", dev_ctx->name, file->name);
|
//LOG_MSG_DEBUG("Getting file stats for \"%s:/%s\".", dev_ctx->name, file->name);
|
||||||
|
|
||||||
/* Fill stat info. */
|
/* Fill stat info. */
|
||||||
hfsdev_fill_stat(st, file->index, file->hfs_entry, dev_ctx->mount_time);
|
hfsdev_fill_stat(st, file->index, file->hfs_entry, dev_ctx->mount_time);
|
||||||
|
@ -245,7 +245,7 @@ static int hfsdev_stat(struct _reent *r, const char *file, struct stat *st)
|
||||||
/* Get truncated path. */
|
/* Get truncated path. */
|
||||||
if (!(file = hfsdev_get_truncated_path(r, file))) DEVOPTAB_EXIT;
|
if (!(file = hfsdev_get_truncated_path(r, file))) DEVOPTAB_EXIT;
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Getting file stats for \"%s:/%s\".", dev_ctx->name, file);
|
//LOG_MSG_DEBUG("Getting file stats for \"%s:/%s\".", dev_ctx->name, file);
|
||||||
|
|
||||||
/* Get information about the requested Hash FS entry. */
|
/* Get information about the requested Hash FS entry. */
|
||||||
if (!hfsGetEntryIndexByName(fs_ctx, file, &index) || !(hfs_entry = hfsGetEntryByIndex(fs_ctx, index))) DEVOPTAB_SET_ERROR_AND_EXIT(ENOENT);
|
if (!hfsGetEntryIndexByName(fs_ctx, file, &index) || !(hfs_entry = hfsGetEntryByIndex(fs_ctx, index))) DEVOPTAB_SET_ERROR_AND_EXIT(ENOENT);
|
||||||
|
@ -269,7 +269,7 @@ static DIR_ITER *hfsdev_diropen(struct _reent *r, DIR_ITER *dirState, const char
|
||||||
if (!(path = hfsdev_get_truncated_path(r, path))) DEVOPTAB_EXIT;
|
if (!(path = hfsdev_get_truncated_path(r, path))) DEVOPTAB_EXIT;
|
||||||
if (*path) DEVOPTAB_SET_ERROR_AND_EXIT(ENOENT);
|
if (*path) DEVOPTAB_SET_ERROR_AND_EXIT(ENOENT);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Opening directory \"%s:/\".", dev_ctx->name);
|
//LOG_MSG_DEBUG("Opening directory \"%s:/\".", dev_ctx->name);
|
||||||
|
|
||||||
/* Reset directory state. */
|
/* Reset directory state. */
|
||||||
memset(dir, 0, sizeof(HashFileSystemDirectoryState));
|
memset(dir, 0, sizeof(HashFileSystemDirectoryState));
|
||||||
|
@ -286,7 +286,7 @@ static int hfsdev_dirreset(struct _reent *r, DIR_ITER *dirState)
|
||||||
{
|
{
|
||||||
HFS_DEV_INIT_DIR_VARS;
|
HFS_DEV_INIT_DIR_VARS;
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Resetting directory state for \"%s:/\".", dev_ctx->name);
|
//LOG_MSG_DEBUG("Resetting directory state for \"%s:/\".", dev_ctx->name);
|
||||||
|
|
||||||
/* Reset directory state. */
|
/* Reset directory state. */
|
||||||
dir->state = 0;
|
dir->state = 0;
|
||||||
|
@ -308,7 +308,7 @@ static int hfsdev_dirnext(struct _reent *r, DIR_ITER *dirState, char *filename,
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (!filename || !filestat) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!filename || !filestat) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Getting info for next directory entry in \"%s:/\" (state %u, index %u).", dev_ctx->name, dir->state, dir->index);
|
//LOG_MSG_DEBUG("Getting info for next directory entry in \"%s:/\" (state %u, index %u).", dev_ctx->name, dir->state, dir->index);
|
||||||
|
|
||||||
if (dir->state < 2)
|
if (dir->state < 2)
|
||||||
{
|
{
|
||||||
|
@ -352,7 +352,7 @@ static int hfsdev_dirclose(struct _reent *r, DIR_ITER *dirState)
|
||||||
{
|
{
|
||||||
HFS_DEV_INIT_DIR_VARS;
|
HFS_DEV_INIT_DIR_VARS;
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Closing directory \"%s:/\".", dev_ctx->name);
|
//LOG_MSG_DEBUG("Closing directory \"%s:/\".", dev_ctx->name);
|
||||||
|
|
||||||
/* Reset directory state. */
|
/* Reset directory state. */
|
||||||
memset(dir, 0, sizeof(HashFileSystemDirectoryState));
|
memset(dir, 0, sizeof(HashFileSystemDirectoryState));
|
||||||
|
@ -374,7 +374,7 @@ static int hfsdev_statvfs(struct _reent *r, const char *path, struct statvfs *bu
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (!buf) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!buf) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Getting filesystem stats for \"%s:\"", dev_ctx->name);
|
//LOG_MSG_DEBUG("Getting filesystem stats for \"%s:\"", dev_ctx->name);
|
||||||
|
|
||||||
/* Get Hash FS total data size. */
|
/* Get Hash FS total data size. */
|
||||||
if (!hfsGetTotalDataSize(fs_ctx, &ext_fs_size)) DEVOPTAB_SET_ERROR_AND_EXIT(EIO);
|
if (!hfsGetTotalDataSize(fs_ctx, &ext_fs_size)) DEVOPTAB_SET_ERROR_AND_EXIT(EIO);
|
||||||
|
@ -411,7 +411,7 @@ static const char *hfsdev_get_truncated_path(struct _reent *r, const char *path)
|
||||||
|
|
||||||
if (!r || !path || !*path) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!r || !path || !*path) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Input path: \"%s\".", path);
|
//LOG_MSG_DEBUG("Input path: \"%s\".", path);
|
||||||
|
|
||||||
/* Move the path pointer to the start of the actual path. */
|
/* Move the path pointer to the start of the actual path. */
|
||||||
do {
|
do {
|
||||||
|
@ -445,7 +445,7 @@ static const char *hfsdev_get_truncated_path(struct _reent *r, const char *path)
|
||||||
if (!len && !path_sep_skipped) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!len && !path_sep_skipped) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
if (len >= FS_MAX_PATH) DEVOPTAB_SET_ERROR_AND_EXIT(ENAMETOOLONG);
|
if (len >= FS_MAX_PATH) DEVOPTAB_SET_ERROR_AND_EXIT(ENAMETOOLONG);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Truncated path: \"%s\".", path);
|
//LOG_MSG_DEBUG("Truncated path: \"%s\".", path);
|
||||||
|
|
||||||
end:
|
end:
|
||||||
DEVOPTAB_RETURN_PTR(path);
|
DEVOPTAB_RETURN_PTR(path);
|
||||||
|
|
|
@ -125,7 +125,7 @@ static int romfsdev_open(struct _reent *r, void *fd, const char *path, int flags
|
||||||
/* Get truncated path. */
|
/* Get truncated path. */
|
||||||
if (!(path = romfsdev_get_truncated_path(r, path))) DEVOPTAB_EXIT;
|
if (!(path = romfsdev_get_truncated_path(r, path))) DEVOPTAB_EXIT;
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Opening \"%s:%s\" with flags 0x%X.", dev_ctx->name, path, flags);
|
//LOG_MSG_DEBUG("Opening \"%s:%s\" with flags 0x%X.", dev_ctx->name, path, flags);
|
||||||
|
|
||||||
/* Reset file descriptor. */
|
/* Reset file descriptor. */
|
||||||
memset(file, 0, sizeof(RomFileSystemFileState));
|
memset(file, 0, sizeof(RomFileSystemFileState));
|
||||||
|
@ -145,7 +145,7 @@ static int romfsdev_close(struct _reent *r, void *fd)
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (!file) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!file) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Closing file \"%.*s\" from \"%s:\".", (int)file->file_entry->name_length, file->file_entry->name, dev_ctx->name);
|
//LOG_MSG_DEBUG("Closing file \"%.*s\" from \"%s:\".", (int)file->file_entry->name_length, file->file_entry->name, dev_ctx->name);
|
||||||
|
|
||||||
/* Reset file descriptor. */
|
/* Reset file descriptor. */
|
||||||
memset(file, 0, sizeof(RomFileSystemFileState));
|
memset(file, 0, sizeof(RomFileSystemFileState));
|
||||||
|
@ -163,8 +163,8 @@ static ssize_t romfsdev_read(struct _reent *r, void *fd, char *ptr, size_t len)
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (!file || !ptr || !len) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!file || !ptr || !len) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Reading 0x%lX byte(s) at offset 0x%lX from file \"%.*s\" in \"%s:\".", len, file->data_offset, (int)file->file_entry->name_length, file->file_entry->name, \
|
/*LOG_MSG_DEBUG("Reading 0x%lX byte(s) at offset 0x%lX from file \"%.*s\" in \"%s:\".", len, file->data_offset, (int)file->file_entry->name_length, file->file_entry->name, \
|
||||||
dev_ctx->name);
|
dev_ctx->name);*/
|
||||||
|
|
||||||
/* Read file data. */
|
/* Read file data. */
|
||||||
if (!romfsReadFileEntryData(fs_ctx, file->file_entry, ptr, len, file->data_offset)) DEVOPTAB_SET_ERROR_AND_EXIT(EIO);
|
if (!romfsReadFileEntryData(fs_ctx, file->file_entry, ptr, len, file->data_offset)) DEVOPTAB_SET_ERROR_AND_EXIT(EIO);
|
||||||
|
@ -210,7 +210,7 @@ static off_t romfsdev_seek(struct _reent *r, void *fd, off_t pos, int dir)
|
||||||
/* Don't allow positive seeks beyond the end of file. */
|
/* Don't allow positive seeks beyond the end of file. */
|
||||||
if (offset > (off_t)file->file_entry->size) DEVOPTAB_SET_ERROR_AND_EXIT(EOVERFLOW);
|
if (offset > (off_t)file->file_entry->size) DEVOPTAB_SET_ERROR_AND_EXIT(EOVERFLOW);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Seeking to offset 0x%lX from file \"%.*s\" in \"%s:\".", offset, (int)file->file_entry->name_length, file->file_entry->name, dev_ctx->name);
|
//LOG_MSG_DEBUG("Seeking to offset 0x%lX from file \"%.*s\" in \"%s:\".", offset, (int)file->file_entry->name_length, file->file_entry->name, dev_ctx->name);
|
||||||
|
|
||||||
/* Adjust offset. */
|
/* Adjust offset. */
|
||||||
file->data_offset = (u64)offset;
|
file->data_offset = (u64)offset;
|
||||||
|
@ -228,7 +228,7 @@ static int romfsdev_fstat(struct _reent *r, void *fd, struct stat *st)
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (!file || !st) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!file || !st) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Getting stats for file \"%.*s\" in \"%s:\".", (int)file->file_entry->name_length, file->file_entry->name, dev_ctx->name);
|
//LOG_MSG_DEBUG("Getting stats for file \"%.*s\" in \"%s:\".", (int)file->file_entry->name_length, file->file_entry->name, dev_ctx->name);
|
||||||
|
|
||||||
/* Fill stat info. */
|
/* Fill stat info. */
|
||||||
romfsdev_fill_file_stat(st, fs_ctx, file->file_entry, dev_ctx->mount_time);
|
romfsdev_fill_file_stat(st, fs_ctx, file->file_entry, dev_ctx->mount_time);
|
||||||
|
@ -251,7 +251,7 @@ static int romfsdev_stat(struct _reent *r, const char *file, struct stat *st)
|
||||||
/* Get truncated path. */
|
/* Get truncated path. */
|
||||||
if (!(file = romfsdev_get_truncated_path(r, file))) DEVOPTAB_EXIT;
|
if (!(file = romfsdev_get_truncated_path(r, file))) DEVOPTAB_EXIT;
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Getting file stats for \"%s:%s\".", dev_ctx->name, file);
|
//LOG_MSG_DEBUG("Getting file stats for \"%s:%s\".", dev_ctx->name, file);
|
||||||
|
|
||||||
/* Get information about the requested RomFS file entry. */
|
/* Get information about the requested RomFS file entry. */
|
||||||
if (!(file_entry = romfsGetFileEntryByPath(fs_ctx, file))) DEVOPTAB_SET_ERROR_AND_EXIT(ENOENT);
|
if (!(file_entry = romfsGetFileEntryByPath(fs_ctx, file))) DEVOPTAB_SET_ERROR_AND_EXIT(ENOENT);
|
||||||
|
@ -274,7 +274,7 @@ static DIR_ITER *romfsdev_diropen(struct _reent *r, DIR_ITER *dirState, const ch
|
||||||
/* Get truncated path. */
|
/* Get truncated path. */
|
||||||
if (!(path = romfsdev_get_truncated_path(r, path))) DEVOPTAB_EXIT;
|
if (!(path = romfsdev_get_truncated_path(r, path))) DEVOPTAB_EXIT;
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Opening directory \"%s:%s\".", dev_ctx->name, path);
|
//LOG_MSG_DEBUG("Opening directory \"%s:%s\".", dev_ctx->name, path);
|
||||||
|
|
||||||
/* Reset directory state. */
|
/* Reset directory state. */
|
||||||
memset(dir, 0, sizeof(RomFileSystemDirectoryState));
|
memset(dir, 0, sizeof(RomFileSystemDirectoryState));
|
||||||
|
@ -297,7 +297,7 @@ static int romfsdev_dirreset(struct _reent *r, DIR_ITER *dirState)
|
||||||
{
|
{
|
||||||
ROMFS_DEV_INIT_DIR_VARS;
|
ROMFS_DEV_INIT_DIR_VARS;
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Resetting state for directory \"%.*s\" in \"%s:\".", (int)dir->dir_entry->name_length, dir->dir_entry->name, dev_ctx->name);
|
//LOG_MSG_DEBUG("Resetting state for directory \"%.*s\" in \"%s:\".", (int)dir->dir_entry->name_length, dir->dir_entry->name, dev_ctx->name);
|
||||||
|
|
||||||
/* Reset directory state. */
|
/* Reset directory state. */
|
||||||
dir->state = 0;
|
dir->state = 0;
|
||||||
|
@ -317,8 +317,8 @@ static int romfsdev_dirnext(struct _reent *r, DIR_ITER *dirState, char *filename
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (!filename || !filestat) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!filename || !filestat) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Getting info for next entry from directory \"%.*s\" in \"%s:\" (state %u, cur_dir_offset 0x%lX, cur_file_offset 0x%lX).", \
|
/*LOG_MSG_DEBUG("Getting info for next entry from directory \"%.*s\" in \"%s:\" (state %u, cur_dir_offset 0x%lX, cur_file_offset 0x%lX).", \
|
||||||
(int)dir->dir_entry->name_length, dir->dir_entry->name, dev_ctx->name, dir->state, dir->cur_dir_offset, dir->cur_file_offset);
|
(int)dir->dir_entry->name_length, dir->dir_entry->name, dev_ctx->name, dir->state, dir->cur_dir_offset, dir->cur_file_offset);*/
|
||||||
|
|
||||||
if (dir->state < 2)
|
if (dir->state < 2)
|
||||||
{
|
{
|
||||||
|
@ -381,7 +381,7 @@ static int romfsdev_dirclose(struct _reent *r, DIR_ITER *dirState)
|
||||||
{
|
{
|
||||||
ROMFS_DEV_INIT_DIR_VARS;
|
ROMFS_DEV_INIT_DIR_VARS;
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Closing directory \"%.*s\" in \"%s:\".", (int)dir->dir_entry->name_length, dir->dir_entry->name, dev_ctx->name);
|
//LOG_MSG_DEBUG("Closing directory \"%.*s\" in \"%s:\".", (int)dir->dir_entry->name_length, dir->dir_entry->name, dev_ctx->name);
|
||||||
|
|
||||||
/* Reset directory state. */
|
/* Reset directory state. */
|
||||||
memset(dir, 0, sizeof(RomFileSystemDirectoryState));
|
memset(dir, 0, sizeof(RomFileSystemDirectoryState));
|
||||||
|
@ -403,7 +403,7 @@ static int romfsdev_statvfs(struct _reent *r, const char *path, struct statvfs *
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (!buf) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!buf) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Getting filesystem stats for \"%s:\"", dev_ctx->name);
|
//LOG_MSG_DEBUG("Getting filesystem stats for \"%s:\"", dev_ctx->name);
|
||||||
|
|
||||||
/* Get RomFS total data size. */
|
/* Get RomFS total data size. */
|
||||||
if (!romfsGetTotalDataSize(fs_ctx, false, &ext_fs_size)) DEVOPTAB_SET_ERROR_AND_EXIT(EIO);
|
if (!romfsGetTotalDataSize(fs_ctx, false, &ext_fs_size)) DEVOPTAB_SET_ERROR_AND_EXIT(EIO);
|
||||||
|
@ -439,7 +439,7 @@ static const char *romfsdev_get_truncated_path(struct _reent *r, const char *pat
|
||||||
|
|
||||||
if (!r || !path || !*path) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!r || !path || !*path) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Input path: \"%s\".", path);
|
//LOG_MSG_DEBUG("Input path: \"%s\".", path);
|
||||||
|
|
||||||
/* Move the path pointer to the start of the actual path. */
|
/* Move the path pointer to the start of the actual path. */
|
||||||
do {
|
do {
|
||||||
|
@ -468,7 +468,7 @@ static const char *romfsdev_get_truncated_path(struct _reent *r, const char *pat
|
||||||
len = strlen(path);
|
len = strlen(path);
|
||||||
if (len >= FS_MAX_PATH) DEVOPTAB_SET_ERROR_AND_EXIT(ENAMETOOLONG);
|
if (len >= FS_MAX_PATH) DEVOPTAB_SET_ERROR_AND_EXIT(ENAMETOOLONG);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Truncated path: \"%s\".", path);
|
//LOG_MSG_DEBUG("Truncated path: \"%s\".", path);
|
||||||
|
|
||||||
end:
|
end:
|
||||||
DEVOPTAB_RETURN_PTR(path);
|
DEVOPTAB_RETURN_PTR(path);
|
||||||
|
|
|
@ -119,7 +119,7 @@ static int pfsdev_open(struct _reent *r, void *fd, const char *path, int flags,
|
||||||
/* Get truncated path. */
|
/* Get truncated path. */
|
||||||
if (!(path = pfsdev_get_truncated_path(r, path))) DEVOPTAB_EXIT;
|
if (!(path = pfsdev_get_truncated_path(r, path))) DEVOPTAB_EXIT;
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Opening \"%s:/%s\" with flags 0x%X.", dev_ctx->name, path, flags);
|
//LOG_MSG_DEBUG("Opening \"%s:/%s\" with flags 0x%X.", dev_ctx->name, path, flags);
|
||||||
|
|
||||||
/* Reset file descriptor. */
|
/* Reset file descriptor. */
|
||||||
memset(file, 0, sizeof(PartitionFileSystemFileState));
|
memset(file, 0, sizeof(PartitionFileSystemFileState));
|
||||||
|
@ -140,7 +140,7 @@ static int pfsdev_close(struct _reent *r, void *fd)
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (!file) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!file) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Closing \"%s:/%s\".", dev_ctx->name, file->name);
|
//LOG_MSG_DEBUG("Closing \"%s:/%s\".", dev_ctx->name, file->name);
|
||||||
|
|
||||||
/* Reset file descriptor. */
|
/* Reset file descriptor. */
|
||||||
memset(file, 0, sizeof(PartitionFileSystemFileState));
|
memset(file, 0, sizeof(PartitionFileSystemFileState));
|
||||||
|
@ -158,7 +158,7 @@ static ssize_t pfsdev_read(struct _reent *r, void *fd, char *ptr, size_t len)
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (!file || !ptr || !len) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!file || !ptr || !len) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Reading 0x%lX byte(s) at offset 0x%lX from \"%s:/%s\".", len, file->offset, dev_ctx->name, file->name);
|
//LOG_MSG_DEBUG("Reading 0x%lX byte(s) at offset 0x%lX from \"%s:/%s\".", len, file->offset, dev_ctx->name, file->name);
|
||||||
|
|
||||||
/* Read file data. */
|
/* Read file data. */
|
||||||
if (!pfsReadEntryData(fs_ctx, file->pfs_entry, ptr, len, file->offset)) DEVOPTAB_SET_ERROR_AND_EXIT(EIO);
|
if (!pfsReadEntryData(fs_ctx, file->pfs_entry, ptr, len, file->offset)) DEVOPTAB_SET_ERROR_AND_EXIT(EIO);
|
||||||
|
@ -204,7 +204,7 @@ static off_t pfsdev_seek(struct _reent *r, void *fd, off_t pos, int dir)
|
||||||
/* Don't allow positive seeks beyond the end of file. */
|
/* Don't allow positive seeks beyond the end of file. */
|
||||||
if (offset > (off_t)file->pfs_entry->size) DEVOPTAB_SET_ERROR_AND_EXIT(EOVERFLOW);
|
if (offset > (off_t)file->pfs_entry->size) DEVOPTAB_SET_ERROR_AND_EXIT(EOVERFLOW);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Seeking to offset 0x%lX from \"%s:/%s\".", offset, dev_ctx->name, file->name);
|
//LOG_MSG_DEBUG("Seeking to offset 0x%lX from \"%s:/%s\".", offset, dev_ctx->name, file->name);
|
||||||
|
|
||||||
/* Adjust offset. */
|
/* Adjust offset. */
|
||||||
file->offset = (u64)offset;
|
file->offset = (u64)offset;
|
||||||
|
@ -221,7 +221,7 @@ static int pfsdev_fstat(struct _reent *r, void *fd, struct stat *st)
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (!file || !st) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!file || !st) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Getting file stats for \"%s:/%s\".", dev_ctx->name, file->name);
|
//LOG_MSG_DEBUG("Getting file stats for \"%s:/%s\".", dev_ctx->name, file->name);
|
||||||
|
|
||||||
/* Fill stat info. */
|
/* Fill stat info. */
|
||||||
pfsdev_fill_stat(st, file->index, file->pfs_entry, dev_ctx->mount_time);
|
pfsdev_fill_stat(st, file->index, file->pfs_entry, dev_ctx->mount_time);
|
||||||
|
@ -245,7 +245,7 @@ static int pfsdev_stat(struct _reent *r, const char *file, struct stat *st)
|
||||||
/* Get truncated path. */
|
/* Get truncated path. */
|
||||||
if (!(file = pfsdev_get_truncated_path(r, file))) DEVOPTAB_EXIT;
|
if (!(file = pfsdev_get_truncated_path(r, file))) DEVOPTAB_EXIT;
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Getting file stats for \"%s:/%s\".", dev_ctx->name, file);
|
//LOG_MSG_DEBUG("Getting file stats for \"%s:/%s\".", dev_ctx->name, file);
|
||||||
|
|
||||||
/* Get information about the requested Partition FS entry. */
|
/* Get information about the requested Partition FS entry. */
|
||||||
if (!pfsGetEntryIndexByName(fs_ctx, file, &index) || !(pfs_entry = pfsGetEntryByIndex(fs_ctx, index))) DEVOPTAB_SET_ERROR_AND_EXIT(ENOENT);
|
if (!pfsGetEntryIndexByName(fs_ctx, file, &index) || !(pfs_entry = pfsGetEntryByIndex(fs_ctx, index))) DEVOPTAB_SET_ERROR_AND_EXIT(ENOENT);
|
||||||
|
@ -269,7 +269,7 @@ static DIR_ITER *pfsdev_diropen(struct _reent *r, DIR_ITER *dirState, const char
|
||||||
if (!(path = pfsdev_get_truncated_path(r, path))) DEVOPTAB_EXIT;
|
if (!(path = pfsdev_get_truncated_path(r, path))) DEVOPTAB_EXIT;
|
||||||
if (*path) DEVOPTAB_SET_ERROR_AND_EXIT(ENOENT);
|
if (*path) DEVOPTAB_SET_ERROR_AND_EXIT(ENOENT);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Opening directory \"%s:/\".", dev_ctx->name);
|
//LOG_MSG_DEBUG("Opening directory \"%s:/\".", dev_ctx->name);
|
||||||
|
|
||||||
/* Reset directory state. */
|
/* Reset directory state. */
|
||||||
memset(dir, 0, sizeof(PartitionFileSystemDirectoryState));
|
memset(dir, 0, sizeof(PartitionFileSystemDirectoryState));
|
||||||
|
@ -286,7 +286,7 @@ static int pfsdev_dirreset(struct _reent *r, DIR_ITER *dirState)
|
||||||
{
|
{
|
||||||
PFS_DEV_INIT_DIR_VARS;
|
PFS_DEV_INIT_DIR_VARS;
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Resetting directory state for \"%s:/\".", dev_ctx->name);
|
//LOG_MSG_DEBUG("Resetting directory state for \"%s:/\".", dev_ctx->name);
|
||||||
|
|
||||||
/* Reset directory state. */
|
/* Reset directory state. */
|
||||||
dir->state = 0;
|
dir->state = 0;
|
||||||
|
@ -308,7 +308,7 @@ static int pfsdev_dirnext(struct _reent *r, DIR_ITER *dirState, char *filename,
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (!filename || !filestat) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!filename || !filestat) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Getting info for next directory entry in \"%s:/\" (state %u, index %u).", dev_ctx->name, dir->state, dir->index);
|
//LOG_MSG_DEBUG("Getting info for next directory entry in \"%s:/\" (state %u, index %u).", dev_ctx->name, dir->state, dir->index);
|
||||||
|
|
||||||
if (dir->state < 2)
|
if (dir->state < 2)
|
||||||
{
|
{
|
||||||
|
@ -352,7 +352,7 @@ static int pfsdev_dirclose(struct _reent *r, DIR_ITER *dirState)
|
||||||
{
|
{
|
||||||
PFS_DEV_INIT_DIR_VARS;
|
PFS_DEV_INIT_DIR_VARS;
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Closing directory \"%s:/\".", dev_ctx->name);
|
//LOG_MSG_DEBUG("Closing directory \"%s:/\".", dev_ctx->name);
|
||||||
|
|
||||||
/* Reset directory state. */
|
/* Reset directory state. */
|
||||||
memset(dir, 0, sizeof(PartitionFileSystemDirectoryState));
|
memset(dir, 0, sizeof(PartitionFileSystemDirectoryState));
|
||||||
|
@ -374,7 +374,7 @@ static int pfsdev_statvfs(struct _reent *r, const char *path, struct statvfs *bu
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (!buf) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!buf) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Getting filesystem stats for \"%s:\"", dev_ctx->name);
|
//LOG_MSG_DEBUG("Getting filesystem stats for \"%s:\"", dev_ctx->name);
|
||||||
|
|
||||||
/* Get Partition FS total data size. */
|
/* Get Partition FS total data size. */
|
||||||
if (!pfsGetTotalDataSize(fs_ctx, &ext_fs_size)) DEVOPTAB_SET_ERROR_AND_EXIT(EIO);
|
if (!pfsGetTotalDataSize(fs_ctx, &ext_fs_size)) DEVOPTAB_SET_ERROR_AND_EXIT(EIO);
|
||||||
|
@ -411,7 +411,7 @@ static const char *pfsdev_get_truncated_path(struct _reent *r, const char *path)
|
||||||
|
|
||||||
if (!r || !path || !*path) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!r || !path || !*path) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Input path: \"%s\".", path);
|
//LOG_MSG_DEBUG("Input path: \"%s\".", path);
|
||||||
|
|
||||||
/* Move the path pointer to the start of the actual path. */
|
/* Move the path pointer to the start of the actual path. */
|
||||||
do {
|
do {
|
||||||
|
@ -445,7 +445,7 @@ static const char *pfsdev_get_truncated_path(struct _reent *r, const char *path)
|
||||||
if (!len && !path_sep_skipped) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
if (!len && !path_sep_skipped) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
|
||||||
if (len >= FS_MAX_PATH) DEVOPTAB_SET_ERROR_AND_EXIT(ENAMETOOLONG);
|
if (len >= FS_MAX_PATH) DEVOPTAB_SET_ERROR_AND_EXIT(ENAMETOOLONG);
|
||||||
|
|
||||||
LOG_MSG_DEBUG("Truncated path: \"%s\".", path);
|
//LOG_MSG_DEBUG("Truncated path: \"%s\".", path);
|
||||||
|
|
||||||
end:
|
end:
|
||||||
DEVOPTAB_RETURN_PTR(path);
|
DEVOPTAB_RETURN_PTR(path);
|
||||||
|
|
Loading…
Reference in a new issue