@@ -726,6 +726,7 @@ static int littlefs_fstat(FAR const struct file *filep, FAR struct stat *buf)
726
726
FAR struct littlefs_mountpt_s * fs ;
727
727
FAR struct littlefs_file_s * priv ;
728
728
FAR struct inode * inode ;
729
+ struct littlefs_attr_s attr ;
729
730
char path [LFS_NAME_MAX ];
730
731
int ret ;
731
732
@@ -745,20 +746,43 @@ static int littlefs_fstat(FAR const struct file *filep, FAR struct stat *buf)
745
746
return ret ;
746
747
}
747
748
748
- ret = lfs_file_path (& fs -> lfs , & priv -> file , path , sizeof (path ));
749
- nxmutex_unlock (& fs -> lock );
750
- if (ret < 0 )
749
+ buf -> st_size = lfs_file_size (& fs -> lfs , & priv -> file );
750
+ if (buf -> st_size < 0 )
751
751
{
752
- return ret ;
752
+ ret = littlefs_convert_result (buf -> st_size );
753
+ goto errout ;
753
754
}
754
755
755
- ret = littlefs_stat (inode , path , buf );
756
+ ret = littlefs_convert_result (lfs_file_getattr (& fs -> lfs , & priv -> file , 0 ,
757
+ & attr , sizeof (attr )));
756
758
if (ret < 0 )
757
759
{
758
- return ret ;
760
+ if (ret != - ENODATA )
761
+ {
762
+ goto errout ;
763
+ }
764
+
765
+ memset (& attr , 0 , sizeof (attr ));
766
+ attr .at_mode = S_IRWXG | S_IRWXU | S_IRWXO ;
759
767
}
760
768
761
- return OK ;
769
+ ret = 0 ;
770
+ buf -> st_mode = attr .at_mode | S_IFREG ;
771
+ buf -> st_uid = attr .at_uid ;
772
+ buf -> st_gid = attr .at_gid ;
773
+ buf -> st_atim .tv_sec = attr .at_atim / 1000000000ull ;
774
+ buf -> st_atim .tv_nsec = attr .at_atim % 1000000000ull ;
775
+ buf -> st_mtim .tv_sec = attr .at_mtim / 1000000000ull ;
776
+ buf -> st_mtim .tv_nsec = attr .at_mtim % 1000000000ull ;
777
+ buf -> st_ctim .tv_sec = attr .at_ctim / 1000000000ull ;
778
+ buf -> st_ctim .tv_nsec = attr .at_ctim % 1000000000ull ;
779
+ buf -> st_blksize = fs -> cfg .block_size ;
780
+ buf -> st_blocks = (buf -> st_size + buf -> st_blksize - 1 ) /
781
+ buf -> st_blksize ;
782
+
783
+ errout :
784
+ nxmutex_unlock (& fs -> lock );
785
+ return ret ;
762
786
}
763
787
764
788
static int littlefs_fchstat (FAR const struct file * filep ,
@@ -767,6 +791,7 @@ static int littlefs_fchstat(FAR const struct file *filep,
767
791
FAR struct littlefs_mountpt_s * fs ;
768
792
FAR struct littlefs_file_s * priv ;
769
793
FAR struct inode * inode ;
794
+ struct littlefs_attr_s attr ;
770
795
char path [LFS_NAME_MAX ];
771
796
int ret ;
772
797
@@ -784,20 +809,59 @@ static int littlefs_fchstat(FAR const struct file *filep,
784
809
return ret ;
785
810
}
786
811
787
- ret = lfs_file_path ( & fs -> lfs , & priv -> file , path , sizeof ( path ));
788
- nxmutex_unlock ( & fs -> lock );
812
+ ret = littlefs_convert_result ( lfs_file_getattr ( & fs -> lfs , & priv -> file ,
813
+ 0 , & attr , sizeof ( attr )) );
789
814
if (ret < 0 )
790
815
{
791
- return ret ;
816
+ if (ret != - ENODATA )
817
+ {
818
+ goto errout ;
819
+ }
820
+
821
+ memset (& attr , 0 , sizeof (attr ));
822
+ attr .at_mode = S_IRWXG | S_IRWXU | S_IRWXO ;
823
+ }
824
+
825
+ if ((CH_STAT_MODE & flags ) == CH_STAT_MODE )
826
+ {
827
+ attr .at_mode = buf -> st_mode ;
828
+ }
829
+
830
+ if ((CH_STAT_UID & flags ) == CH_STAT_UID )
831
+ {
832
+ attr .at_uid = buf -> st_uid ;
833
+ }
834
+
835
+ if ((CH_STAT_GID & flags ) == CH_STAT_GID )
836
+ {
837
+ attr .at_gid = buf -> st_gid ;
838
+ }
839
+
840
+ attr .at_ctim = 1000000000ull * buf -> st_ctim .tv_sec +
841
+ buf -> st_ctim .tv_nsec ;
842
+
843
+ if ((CH_STAT_ATIME & flags ) == CH_STAT_ATIME )
844
+ {
845
+ attr .at_atim = 1000000000ull * buf -> st_atim .tv_sec +
846
+ buf -> st_atim .tv_nsec ;
792
847
}
793
848
794
- ret = littlefs_chstat (inode , path , buf , flags );
849
+ if ((CH_STAT_MTIME & flags ) == CH_STAT_MTIME )
850
+ {
851
+ attr .at_mtim = 1000000000ull * buf -> st_mtim .tv_sec +
852
+ buf -> st_mtim .tv_nsec ;
853
+ }
854
+
855
+ ret = littlefs_convert_result (lfs_file_setattr (& fs -> lfs , & priv -> file , 0 ,
856
+ & attr , sizeof (attr )));
795
857
if (ret < 0 )
796
858
{
797
- return ret ;
859
+ goto errout ;
798
860
}
799
861
800
- return OK ;
862
+ errout :
863
+ nxmutex_unlock (& fs -> lock );
864
+ return ret ;
801
865
}
802
866
803
867
/****************************************************************************
@@ -1587,18 +1651,19 @@ static int littlefs_stat(FAR struct inode *mountpt, FAR const char *relpath,
1587
1651
buf -> st_mtim .tv_nsec = attr .at_mtim % 1000000000ull ;
1588
1652
buf -> st_ctim .tv_sec = attr .at_ctim / 1000000000ull ;
1589
1653
buf -> st_ctim .tv_nsec = attr .at_ctim % 1000000000ull ;
1590
- buf -> st_size = info .size ;
1591
1654
buf -> st_blksize = fs -> cfg .block_size ;
1592
1655
buf -> st_blocks = (buf -> st_size + buf -> st_blksize - 1 ) /
1593
1656
buf -> st_blksize ;
1594
1657
1595
1658
if (info .type == LFS_TYPE_REG )
1596
1659
{
1597
1660
buf -> st_mode |= S_IFREG ;
1661
+ buf -> st_size = info .size ;
1598
1662
}
1599
1663
else
1600
1664
{
1601
1665
buf -> st_mode |= S_IFDIR ;
1666
+ buf -> st_size = 0 ;
1602
1667
}
1603
1668
1604
1669
errout :
0 commit comments