Added internal lfs_dir_get to consolidate logic for reading dir entries

It's a relatively simple function but offers some code reuse as well as
making the dir entry operations a bit more readable.
This commit is contained in:
Christopher Haster
2018-03-23 18:35:55 -05:00
parent d0e0453651
commit ad74825bcf

29
lfs.c
View File

@@ -677,6 +677,12 @@ relocate:
return 0; return 0;
} }
// TODO zeros?
static int lfs_dir_get(lfs_t *lfs, const lfs_dir_t *dir,
lfs_off_t off, void *buffer, lfs_size_t size) {
return lfs_bd_read(lfs, dir->pair[0], off, buffer, size);
}
static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir, static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir,
lfs_entry_t *entry, struct lfs_region *regions) { lfs_entry_t *entry, struct lfs_region *regions) {
// check if we fit, if top bit is set we do not and move on // check if we fit, if top bit is set we do not and move on
@@ -876,8 +882,7 @@ static int lfs_dir_next(lfs_t *lfs, lfs_dir_t *dir, lfs_entry_t *entry) {
dir->pos += sizeof(dir->d) + 4; dir->pos += sizeof(dir->d) + 4;
} }
int err = lfs_bd_read(lfs, dir->pair[0], dir->off, int err = lfs_dir_get(lfs, dir, dir->off, &entry->d, sizeof(entry->d));
&entry->d, sizeof(entry->d));
lfs_entry_fromle32(&entry->d); lfs_entry_fromle32(&entry->d);
if (err) { if (err) {
return err; return err;
@@ -1167,7 +1172,7 @@ int lfs_dir_read(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info) {
info->size = entry.d.elen; info->size = entry.d.elen;
} }
int err = lfs_bd_read(lfs, dir->pair[0], int err = lfs_dir_get(lfs, dir,
entry.off + entry.size - entry.d.nlen, entry.off + entry.size - entry.d.nlen,
info->name, entry.d.nlen); info->name, entry.d.nlen);
if (err) { if (err) {
@@ -1502,7 +1507,7 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file,
file->flags |= LFS_F_INLINE; file->flags |= LFS_F_INLINE;
file->cache.block = file->head; file->cache.block = file->head;
file->cache.off = 0; file->cache.off = 0;
err = lfs_bd_read(lfs, cwd.pair[0], err = lfs_dir_get(lfs, &cwd,
entry.off + 4, entry.off + 4,
file->cache.buffer, file->size); file->cache.buffer, file->size);
if (err) { if (err) {
@@ -1679,8 +1684,8 @@ int lfs_file_sync(lfs_t *lfs, lfs_file_t *file) {
// TODO entry read function? // TODO entry read function?
lfs_entry_t entry = {.off = file->poff}; lfs_entry_t entry = {.off = file->poff};
err = lfs_bd_read(lfs, cwd.pair[0], entry.off, err = lfs_dir_get(lfs, &cwd,
&entry.d, sizeof(entry.d)); entry.off, &entry.d, sizeof(entry.d));
lfs_entry_fromle32(&entry.d); lfs_entry_fromle32(&entry.d);
if (err) { if (err) {
return err; return err;
@@ -2047,7 +2052,7 @@ int lfs_stat(lfs_t *lfs, const char *path, struct lfs_info *info) {
if (lfs_paircmp(entry.d.u.dir, lfs->root) == 0) { if (lfs_paircmp(entry.d.u.dir, lfs->root) == 0) {
strcpy(info->name, "/"); strcpy(info->name, "/");
} else { } else {
err = lfs_bd_read(lfs, cwd.pair[0], err = lfs_dir_get(lfs, &cwd,
entry.off + entry.size - entry.d.nlen, entry.off + entry.size - entry.d.nlen,
info->name, entry.d.nlen); info->name, entry.d.nlen);
if (err) { if (err) {
@@ -2439,14 +2444,14 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) {
} }
if (!err) { if (!err) {
err = lfs_bd_read(lfs, dir.pair[0], sizeof(dir.d)+4, err = lfs_dir_get(lfs, &dir,
&superblock.d, sizeof(superblock.d)); sizeof(dir.d)+4, &superblock.d, sizeof(superblock.d));
lfs_superblock_fromle32(&superblock.d); lfs_superblock_fromle32(&superblock.d);
if (err) { if (err) {
return err; return err;
} }
err = lfs_bd_read(lfs, dir.pair[0], err = lfs_dir_get(lfs, &dir,
sizeof(dir.d) + 4 + sizeof(superblock.d), sizeof(dir.d) + 4 + sizeof(superblock.d),
magic, sizeof(magic)); magic, sizeof(magic));
if (err) { if (err) {
@@ -2504,8 +2509,8 @@ int lfs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data) {
// iterate over contents // iterate over contents
lfs_entry_t entry; lfs_entry_t entry;
while (dir.off + sizeof(entry.d) <= (0x7fffffff & dir.d.size)-4) { while (dir.off + sizeof(entry.d) <= (0x7fffffff & dir.d.size)-4) {
err = lfs_bd_read(lfs, dir.pair[0], dir.off, err = lfs_dir_get(lfs, &dir,
&entry.d, sizeof(entry.d)); dir.off, &entry.d, sizeof(entry.d));
lfs_entry_fromle32(&entry.d); lfs_entry_fromle32(&entry.d);
if (err) { if (err) {
return err; return err;