@@ -783,26 +783,19 @@ static int lfs_dir_find(lfs_t *lfs, lfs_dir_t *dir,
783
783
lfs_entry_t * entry , const char * * path ) {
784
784
const char * pathname = * path ;
785
785
size_t pathlen ;
786
+ entry -> d .type = LFS_TYPE_DIR ;
787
+ entry -> d .elen = sizeof (entry -> d ) - 4 ;
788
+ entry -> d .alen = 0 ;
789
+ entry -> d .nlen = 0 ;
790
+ entry -> d .u .dir [0 ] = lfs -> root [0 ];
791
+ entry -> d .u .dir [1 ] = lfs -> root [1 ];
786
792
787
793
while (true) {
788
- nextname :
794
+ nextname :
789
795
// skip slashes
790
796
pathname += strspn (pathname , "/" );
791
797
pathlen = strcspn (pathname , "/" );
792
798
793
- // special case for root dir
794
- if (pathname [0 ] == '\0' ) {
795
- * entry = (lfs_entry_t ){
796
- .d .type = LFS_TYPE_DIR ,
797
- .d .elen = sizeof (entry -> d ) - 4 ,
798
- .d .alen = 0 ,
799
- .d .nlen = 0 ,
800
- .d .u .dir [0 ] = lfs -> root [0 ],
801
- .d .u .dir [1 ] = lfs -> root [1 ],
802
- };
803
- return 0 ;
804
- }
805
-
806
799
// skip '.' and root '..'
807
800
if ((pathlen == 1 && memcmp (pathname , "." , 1 ) == 0 ) ||
808
801
(pathlen == 2 && memcmp (pathname , ".." , 2 ) == 0 )) {
@@ -834,10 +827,25 @@ static int lfs_dir_find(lfs_t *lfs, lfs_dir_t *dir,
834
827
suffix += sufflen ;
835
828
}
836
829
830
+ // found path
831
+ if (pathname [0 ] == '\0' ) {
832
+ return 0 ;
833
+ }
834
+
837
835
// update what we've found
838
836
* path = pathname ;
839
837
840
- // find path
838
+ // continue on if we hit a directory
839
+ if (entry -> d .type != LFS_TYPE_DIR ) {
840
+ return LFS_ERR_NOTDIR ;
841
+ }
842
+
843
+ int err = lfs_dir_fetch (lfs , dir , entry -> d .u .dir );
844
+ if (err ) {
845
+ return err ;
846
+ }
847
+
848
+ // find entry matching name
841
849
while (true) {
842
850
int err = lfs_dir_next (lfs , dir , entry );
843
851
if (err ) {
@@ -873,21 +881,8 @@ static int lfs_dir_find(lfs_t *lfs, lfs_dir_t *dir,
873
881
entry -> d .type &= ~0x80 ;
874
882
}
875
883
884
+ // to next name
876
885
pathname += pathlen ;
877
- pathname += strspn (pathname , "/" );
878
- if (pathname [0 ] == '\0' ) {
879
- return 0 ;
880
- }
881
-
882
- // continue on if we hit a directory
883
- if (entry -> d .type != LFS_TYPE_DIR ) {
884
- return LFS_ERR_NOTDIR ;
885
- }
886
-
887
- int err = lfs_dir_fetch (lfs , dir , entry -> d .u .dir );
888
- if (err ) {
889
- return err ;
890
- }
891
886
}
892
887
}
893
888
@@ -904,13 +899,8 @@ int lfs_mkdir(lfs_t *lfs, const char *path) {
904
899
905
900
// fetch parent directory
906
901
lfs_dir_t cwd ;
907
- int err = lfs_dir_fetch (lfs , & cwd , lfs -> root );
908
- if (err ) {
909
- return err ;
910
- }
911
-
912
902
lfs_entry_t entry ;
913
- err = lfs_dir_find (lfs , & cwd , & entry , & path );
903
+ int err = lfs_dir_find (lfs , & cwd , & entry , & path );
914
904
if (err != LFS_ERR_NOENT || strchr (path , '/' ) != NULL ) {
915
905
return err ? err : LFS_ERR_EXIST ;
916
906
}
@@ -954,13 +944,8 @@ int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path) {
954
944
dir -> pair [0 ] = lfs -> root [0 ];
955
945
dir -> pair [1 ] = lfs -> root [1 ];
956
946
957
- int err = lfs_dir_fetch (lfs , dir , dir -> pair );
958
- if (err ) {
959
- return err ;
960
- }
961
-
962
947
lfs_entry_t entry ;
963
- err = lfs_dir_find (lfs , dir , & entry , & path );
948
+ int err = lfs_dir_find (lfs , dir , & entry , & path );
964
949
if (err ) {
965
950
return err ;
966
951
} else if (entry .d .type != LFS_TYPE_DIR ) {
@@ -1302,13 +1287,8 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file,
1302
1287
1303
1288
// allocate entry for file if it doesn't exist
1304
1289
lfs_dir_t cwd ;
1305
- int err = lfs_dir_fetch (lfs , & cwd , lfs -> root );
1306
- if (err ) {
1307
- return err ;
1308
- }
1309
-
1310
1290
lfs_entry_t entry ;
1311
- err = lfs_dir_find (lfs , & cwd , & entry , & path );
1291
+ int err = lfs_dir_find (lfs , & cwd , & entry , & path );
1312
1292
if (err && (err != LFS_ERR_NOENT || strchr (path , '/' ) != NULL )) {
1313
1293
return err ;
1314
1294
}
@@ -1814,13 +1794,8 @@ lfs_soff_t lfs_file_size(lfs_t *lfs, lfs_file_t *file) {
1814
1794
/// General fs operations ///
1815
1795
int lfs_stat (lfs_t * lfs , const char * path , struct lfs_info * info ) {
1816
1796
lfs_dir_t cwd ;
1817
- int err = lfs_dir_fetch (lfs , & cwd , lfs -> root );
1818
- if (err ) {
1819
- return err ;
1820
- }
1821
-
1822
1797
lfs_entry_t entry ;
1823
- err = lfs_dir_find (lfs , & cwd , & entry , & path );
1798
+ int err = lfs_dir_find (lfs , & cwd , & entry , & path );
1824
1799
if (err ) {
1825
1800
return err ;
1826
1801
}
@@ -1855,13 +1830,8 @@ int lfs_remove(lfs_t *lfs, const char *path) {
1855
1830
}
1856
1831
1857
1832
lfs_dir_t cwd ;
1858
- int err = lfs_dir_fetch (lfs , & cwd , lfs -> root );
1859
- if (err ) {
1860
- return err ;
1861
- }
1862
-
1863
1833
lfs_entry_t entry ;
1864
- err = lfs_dir_find (lfs , & cwd , & entry , & path );
1834
+ int err = lfs_dir_find (lfs , & cwd , & entry , & path );
1865
1835
if (err ) {
1866
1836
return err ;
1867
1837
}
@@ -1916,24 +1886,14 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) {
1916
1886
1917
1887
// find old entry
1918
1888
lfs_dir_t oldcwd ;
1919
- int err = lfs_dir_fetch (lfs , & oldcwd , lfs -> root );
1920
- if (err ) {
1921
- return err ;
1922
- }
1923
-
1924
1889
lfs_entry_t oldentry ;
1925
- err = lfs_dir_find (lfs , & oldcwd , & oldentry , & oldpath );
1890
+ int err = lfs_dir_find (lfs , & oldcwd , & oldentry , & oldpath );
1926
1891
if (err ) {
1927
1892
return err ;
1928
1893
}
1929
1894
1930
1895
// allocate new entry
1931
1896
lfs_dir_t newcwd ;
1932
- err = lfs_dir_fetch (lfs , & newcwd , lfs -> root );
1933
- if (err ) {
1934
- return err ;
1935
- }
1936
-
1937
1897
lfs_entry_t preventry ;
1938
1898
err = lfs_dir_find (lfs , & newcwd , & preventry , & newpath );
1939
1899
if (err && (err != LFS_ERR_NOENT || strchr (newpath , '/' ) != NULL )) {
0 commit comments