From efc634f3eda926f33bf7373b31c913e974cfd920 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Sat, 10 Mar 2018 18:27:43 -0600 Subject: [PATCH] WIP something something flexible updates --- lfs.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 3 deletions(-) diff --git a/lfs.c b/lfs.c index ea9eaa5..1e48a86 100644 --- a/lfs.c +++ b/lfs.c @@ -666,6 +666,59 @@ static int lfs_dir_update(lfs_t *lfs, lfs_dir_t *dir, return err; } +static int lfs_dir_append_(lfs_t *lfs, lfs_dir_t *dir, + lfs_entry_t *entry, struct lfs_region *region) { + // check if we fit, if top bit is set we do not and move on + while (true) { + if (dir->d.size + lfs_entry_size(entry) <= lfs->cfg->block_size) { + entry->off = dir->d.size - 4; + for (struct lfs_region *r = region; r; r = r->next) { + r->oldoff += entry->off; + } + + lfs_entry_tole32(&entry->d); + int err = lfs_dir_commit(lfs, dir, + &(struct lfs_region){ + LFS_FROM_MEM, entry->off, 0, + {.m.data = &entry->d}, 4, region}); + lfs_entry_fromle32(&entry->d); + return err; + } + + // we need to allocate a new dir block + if (!(0x80000000 & dir->d.size)) { + lfs_dir_t olddir = *dir; + int err = lfs_dir_alloc(lfs, dir); + if (err) { + return err; + } + + dir->d.tail[0] = olddir.d.tail[0]; + dir->d.tail[1] = olddir.d.tail[1]; + entry->off = dir->d.size - 4; + lfs_entry_tole32(&entry->d); + err = lfs_dir_commit(lfs, dir, + &(struct lfs_region){ + LFS_FROM_MEM, entry->off, 0, + {.m.data = &entry->d}, 4, region}); + lfs_entry_fromle32(&entry->d); + if (err) { + return err; + } + + olddir.d.size |= 0x80000000; + olddir.d.tail[0] = dir->pair[0]; + olddir.d.tail[1] = dir->pair[1]; + return lfs_dir_commit(lfs, &olddir, NULL); + } + + int err = lfs_dir_fetch(lfs, dir, dir->d.tail); + if (err) { + return err; + } + } +} + static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir, lfs_entry_t *entry, const void *data) { // check if we fit, if top bit is set we do not and move on @@ -963,7 +1016,13 @@ int lfs_mkdir(lfs_t *lfs, const char *path) { cwd.d.tail[0] = dir.pair[0]; cwd.d.tail[1] = dir.pair[1]; - err = lfs_dir_append(lfs, &cwd, &entry, path); + err = lfs_dir_append_(lfs, &cwd, &entry, + &(struct lfs_region){ + LFS_FROM_MEM, 0, 0, + {.m.data = (uint8_t*)&entry.d + 4}, sizeof(entry.d) - 4, + &(struct lfs_region){ + LFS_FROM_MEM, 0, 0, + {.m.data = path}, entry.d.nlen}}); if (err) { return err; } @@ -1347,7 +1406,13 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file, entry.d.nlen = strlen(path); entry.d.u.file.head = 0xffffffff; entry.d.u.file.size = 0; - err = lfs_dir_append(lfs, &cwd, &entry, path); + err = lfs_dir_append_(lfs, &cwd, &entry, + &(struct lfs_region){ + LFS_FROM_MEM, 0, 0, + {.m.data = (uint8_t*)&entry.d + 4}, sizeof(entry.d) - 4, + &(struct lfs_region){ + LFS_FROM_MEM, 0, 0, + {.m.data = path}, entry.d.nlen}}); if (err) { return err; } @@ -2007,7 +2072,13 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) { return err; } } else { - err = lfs_dir_append(lfs, &newcwd, &newentry, newpath); + err = lfs_dir_append_(lfs, &newcwd, &newentry, + &(struct lfs_region){ + LFS_FROM_MEM, 0, 0, + {.m.data = (uint8_t*)&newentry.d + 4}, sizeof(newentry.d) - 4, + &(struct lfs_region){ + LFS_FROM_MEM, 0, 0, + {.m.data = newpath}, newentry.d.nlen}}); if (err) { return err; }