Improved dir entry get function (ext4_dir_entry_next)
[lwext4.git] / lwext4 / ext4.c
index 85d1fca15de4b920b242c08658ed8cf96b923d90..dfaa5ce8f5f36c46970667c8facbcd69b164c65b 100644 (file)
@@ -1369,6 +1369,7 @@ int ext4_dir_open (ext4_dir *d, const char *path)
 \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
@@ -1378,42 +1379,37 @@ int ext4_dir_close(ext4_dir *d)
     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