@@ -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
547568int 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
671692int 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