projects
/
lwext4.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Improved dir entry get function (ext4_dir_entry_next)
[lwext4.git]
/
lwext4
/
ext4.c
diff --git
a/lwext4/ext4.c
b/lwext4/ext4.c
index 85d1fca15de4b920b242c08658ed8cf96b923d90..dfaa5ce8f5f36c46970667c8facbcd69b164c65b 100644
(file)
--- a/
lwext4/ext4.c
+++ b/
lwext4/ext4.c
@@
-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
\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
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
return ext4_fclose(&d->f);
\r
}
\r
\r
-ext4_direntry* ext4_dir_entry_
get(ext4_dir *d, uint32_t i
d)
\r
+ext4_direntry* ext4_dir_entry_
next(ext4_dir *
d)
\r
{
\r
{
\r
+#define EXT4_DIR_ENTRY_OFFSET_TERM (uint64_t)(-1)
\r
+
\r
int 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
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_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
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
\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
\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
\r
ext4_dir_iterator_fini(&it);
\r
ext4_fs_put_inode_ref(&dir);
\r