Skip to content

Commit 59e12a1

Browse files
mtheallfincs
authored andcommitted
Fix stat for romfs:/
1 parent 2e48185 commit 59e12a1

1 file changed

Lines changed: 35 additions & 32 deletions

File tree

libctru/source/romfs_dev.c

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -495,12 +495,9 @@ static int navigateToDir(romfs_mount *mount, romfs_dir** ppDir, const char** pPa
495495

496496
*ppDir = searchForDir(mount, *ppDir, __utf16path, units);
497497
if (!*ppDir)
498-
return EEXIST;
498+
return ENOENT;
499499
}
500500

501-
if (!isDir && !**pPath)
502-
return EILSEQ;
503-
504501
return 0;
505502
}
506503

@@ -542,6 +539,30 @@ static ino_t file_inode(romfs_mount *mount, romfs_file *file)
542539
return ((uint32_t*)file - (uint32_t*)mount->fileTable) + mount->header.dirTableSize/4;
543540
}
544541

542+
static void fill_dir(struct stat *st, romfs_mount *mount, romfs_dir *dir)
543+
{
544+
memset(st, 0, sizeof(*st));
545+
st->st_ino = dir_inode(mount, dir);
546+
st->st_mode = romFS_dir_mode;
547+
st->st_nlink = dir_nlink(mount, dir);
548+
st->st_size = dir_size(dir);
549+
st->st_blksize = 512;
550+
st->st_blocks = (st->st_blksize + 511) / 512;
551+
st->st_atime = st->st_mtime = st->st_ctime = mount->mtime;
552+
}
553+
554+
static void fill_file(struct stat *st, romfs_mount *mount, romfs_file *file)
555+
{
556+
memset(st, 0, sizeof(*st));
557+
st->st_ino = file_inode(mount, file);
558+
st->st_mode = romFS_file_mode;
559+
st->st_nlink = 1;
560+
st->st_size = (off_t)file->dataSize;
561+
st->st_blksize = 512;
562+
st->st_blocks = (st->st_blksize + 511) / 512;
563+
st->st_atime = st->st_mtime = st->st_ctime = mount->mtime;
564+
}
565+
545566
//-----------------------------------------------------------------------------
546567

547568
int romfs_open(struct _reent *r, void *fileStruct, const char *path, int flags, int mode)
@@ -670,16 +691,8 @@ off_t romfs_seek(struct _reent *r, void *fd, off_t pos, int dir)
670691

671692
int romfs_fstat(struct _reent *r, void *fd, struct stat *st)
672693
{
673-
romfs_fileobj* file = (romfs_fileobj*)fd;
674-
memset(st, 0, sizeof(struct stat));
675-
st->st_ino = file_inode(file->mount, file->file);
676-
st->st_mode = romFS_file_mode;
677-
st->st_nlink = 1;
678-
st->st_size = (off_t)file->file->dataSize;
679-
st->st_blksize = 512;
680-
st->st_blocks = (st->st_blksize + 511) / 512;
681-
st->st_atime = st->st_mtime = st->st_ctime = file->mount->mtime;
682-
694+
romfs_fileobj* fileobj = (romfs_fileobj*)fd;
695+
fill_file(st, fileobj->mount, fileobj->file);
683696
return 0;
684697
}
685698

@@ -691,6 +704,12 @@ int romfs_stat(struct _reent *r, const char *path, struct stat *st)
691704
if(r->_errno != 0)
692705
return -1;
693706

707+
if (!*path)
708+
{
709+
fill_dir(st, mount, curDir);
710+
return 0;
711+
}
712+
694713
ssize_t units = utf8_to_utf16(__utf16path, (const uint8_t*)path, PATH_MAX);
695714
if (units <= 0)
696715
{
@@ -706,30 +725,14 @@ int romfs_stat(struct _reent *r, const char *path, struct stat *st)
706725
romfs_dir* dir = searchForDir(mount, curDir, __utf16path, units);
707726
if(dir)
708727
{
709-
memset(st, 0, sizeof(*st));
710-
st->st_ino = dir_inode(mount, dir);
711-
st->st_mode = romFS_dir_mode;
712-
st->st_nlink = dir_nlink(mount, dir);
713-
st->st_size = dir_size(dir);
714-
st->st_blksize = 512;
715-
st->st_blocks = (st->st_blksize + 511) / 512;
716-
st->st_atime = st->st_mtime = st->st_ctime = mount->mtime;
717-
728+
fill_dir(st, mount, dir);
718729
return 0;
719730
}
720731

721732
romfs_file* file = searchForFile(mount, curDir, __utf16path, units);
722733
if(file)
723734
{
724-
memset(st, 0, sizeof(*st));
725-
st->st_ino = file_inode(mount, file);
726-
st->st_mode = romFS_file_mode;
727-
st->st_nlink = 1;
728-
st->st_size = file->dataSize;
729-
st->st_blksize = 512;
730-
st->st_blocks = (st->st_blksize + 511) / 512;
731-
st->st_atime = st->st_mtime = st->st_ctime = mount->mtime;
732-
735+
fill_file(st, mount, file);
733736
return 0;
734737
}
735738

0 commit comments

Comments
 (0)