\r
EXT4_MP_LOCK(mp);\r
r = ext4_generic_open(&d->f, path, "r", false, 0, 0);\r
+ d->next_off = 0;\r
EXT4_MP_UNLOCK(mp);\r
return r;\r
}\r
return ext4_fclose(&d->f);\r
}\r
\r
-ext4_direntry* ext4_dir_entry_get(ext4_dir *d, uint32_t id)\r
+ext4_direntry* ext4_dir_entry_next(ext4_dir *d)\r
{\r
+#define EXT4_DIR_ENTRY_OFFSET_TERM (uint64_t)(-1)\r
+\r
int r;\r
- uint32_t i;\r
ext4_direntry *de = 0;\r
struct ext4_inode_ref dir;\r
struct ext4_directory_iterator it;\r
\r
EXT4_MP_LOCK(d->f.mp);\r
\r
+ if(d->next_off == EXT4_DIR_ENTRY_OFFSET_TERM)\r
+ return 0;\r
+\r
r = ext4_fs_get_inode_ref(&d->f.mp->fs, d->f.inode, &dir);\r
if(r != EOK){\r
goto Finish;\r
}\r
\r
- r = ext4_dir_iterator_init(&it, &dir, 0);\r
+ r = ext4_dir_iterator_init(&it, &dir, d->next_off);\r
if(r != EOK){\r
ext4_fs_put_inode_ref(&dir);\r
goto Finish;\r
}\r
\r
- i = 0;\r
- while(r == EOK){\r
-\r
- if(!it.current)\r
- break;\r
+ memcpy(&d->de, it.current, sizeof(ext4_direntry));\r
+ de = &d->de;\r
\r
- if(i == id){\r
- memcpy(&d->de, it.current, sizeof(ext4_direntry));\r
- de = &d->de;\r
- break;\r
- }\r
+ ext4_dir_iterator_next(&it);\r
\r
- i++;\r
- r = ext4_dir_iterator_next(&it);\r
- }\r
+ d->next_off = it.current ? it.current_offset : EXT4_DIR_ENTRY_OFFSET_TERM;\r
\r
ext4_dir_iterator_fini(&it);\r
ext4_fs_put_inode_ref(&dir);\r