From db795f42ada65fbd9b73257b4c2c48ee4ca56934 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Wed, 27 May 2020 13:48:14 +0100 Subject: [PATCH] fix stat for romfs directories --- nx/source/runtime/devices/romfs_dev.c | 62 +++++++++++++++------------ 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/nx/source/runtime/devices/romfs_dev.c b/nx/source/runtime/devices/romfs_dev.c index c33bffa3..0dd50374 100644 --- a/nx/source/runtime/devices/romfs_dev.c +++ b/nx/source/runtime/devices/romfs_dev.c @@ -560,9 +560,6 @@ static int navigateToDir(romfs_mount *mount, romfs_dir** ppDir, const char** pPa return ret; } - if (!isDir && !**pPath) - return EILSEQ; - return 0; } @@ -721,17 +718,35 @@ off_t romfs_seek(struct _reent *r, void *fd, off_t pos, int dir) return file->pos; } -int romfs_fstat(struct _reent *r, void *fd, struct stat *st) +static void fillDir(struct stat *st, romfs_mount *mount, romfs_dir *dir) { - romfs_fileobj* file = (romfs_fileobj*)fd; - memset(st, 0, sizeof(struct stat)); - st->st_ino = file_inode(file->mount, file->file); - st->st_mode = romFS_file_mode; - st->st_nlink = 1; - st->st_size = (off_t)file->file->dataSize; + memset(st, 0, sizeof(*st)); + st->st_ino = dir_inode(mount, dir); + st->st_mode = romFS_dir_mode; + st->st_nlink = dir_nlink(mount, dir); + st->st_size = dir_size(dir); st->st_blksize = 512; st->st_blocks = (st->st_blksize + 511) / 512; - st->st_atime = st->st_mtime = st->st_ctime = file->mount->mtime; + st->st_atime = st->st_mtime = st->st_ctime = mount->mtime; +} + +static void fillFile (struct stat *st, romfs_mount *mount, romfs_file *file) +{ + memset(st, 0, sizeof(struct stat)); + st->st_ino = file_inode(mount, file); + st->st_mode = romFS_file_mode; + st->st_nlink = 1; + st->st_size = (off_t)file->dataSize; + st->st_blksize = 512; + st->st_blocks = (st->st_blksize + 511) / 512; + st->st_atime = st->st_mtime = st->st_ctime = mount->mtime; + +} + +int romfs_fstat(struct _reent *r, void *fd, struct stat *st) +{ + romfs_fileobj* fileobj = (romfs_fileobj*)fd; + fillFile(st, fileobj->mount, fileobj->file); return 0; } @@ -744,6 +759,12 @@ int romfs_stat(struct _reent *r, const char *path, struct stat *st) if(r->_errno != 0) return -1; + if(!*path) + { + fillDir(st,mount,curDir); + return 0; + } + romfs_dir* dir = NULL; int ret=0; ret = searchForDir(mount, curDir, (uint8_t*)path, strlen(path), &dir); @@ -754,14 +775,7 @@ int romfs_stat(struct _reent *r, const char *path, struct stat *st) } if(ret == 0) { - memset(st, 0, sizeof(*st)); - st->st_ino = dir_inode(mount, dir); - st->st_mode = romFS_dir_mode; - st->st_nlink = dir_nlink(mount, dir); - st->st_size = dir_size(dir); - st->st_blksize = 512; - st->st_blocks = (st->st_blksize + 511) / 512; - st->st_atime = st->st_mtime = st->st_ctime = mount->mtime; + fillDir(st,mount,dir); return 0; } @@ -775,15 +789,7 @@ int romfs_stat(struct _reent *r, const char *path, struct stat *st) } if(ret == 0) { - memset(st, 0, sizeof(*st)); - st->st_ino = file_inode(mount, file); - st->st_mode = romFS_file_mode; - st->st_nlink = 1; - st->st_size = file->dataSize; - st->st_blksize = 512; - st->st_blocks = (st->st_blksize + 511) / 512; - st->st_atime = st->st_mtime = st->st_ctime = mount->mtime; - + fillFile(st,mount,file); return 0; }