From 754b4c3cdaecf269a8382cf02e90b9eaa74eeb73 Mon Sep 17 00:00:00 2001 From: Maxime Vincent Date: Tue, 17 Nov 2020 14:48:46 +0100 Subject: [PATCH] Squash of LFS_READONLY cleanup - undef unavailable function declarations altogether - even less code, assert on write attempts - remove LFS_O_WRONLY and other flags when compiling with LFS_READONLY - do not annotate #endif, as requested - move ifdef before comments blocks, rework dangling opening bracket - ifdef file flags that are not needed in read-only mode - slight refactor - ifdef LFS_F_ERRED out as well --- lfs.c | 104 +++++++++++++++++++++++++++++----------------------------- lfs.h | 27 +++++++++++++-- 2 files changed, 77 insertions(+), 54 deletions(-) diff --git a/lfs.c b/lfs.c index be70e20..57769a9 100644 --- a/lfs.c +++ b/lfs.c @@ -1950,10 +1950,8 @@ compact: /// Top level directory operations /// +#ifndef LFS_READONLY int lfs_mkdir(lfs_t *lfs, const char *path) { -#ifdef LFS_READONLY - return LFS_ERR_NOSYS; -#else LFS_TRACE("lfs_mkdir(%p, \"%s\")", (void*)lfs, path); // deorphan if we haven't yet, needed at most once after poweron int err = lfs_fs_forceconsistency(lfs); @@ -2050,8 +2048,8 @@ int lfs_mkdir(lfs_t *lfs, const char *path) { LFS_TRACE("lfs_mkdir -> %d", 0); return 0; -#endif } +#endif int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path) { LFS_TRACE("lfs_dir_open(%p, %p, \"%s\")", (void*)lfs, (void*)dir, path); @@ -2438,18 +2436,18 @@ int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, (void*)lfs, (void*)file, path, flags, (void*)cfg, cfg->buffer, (void*)cfg->attrs, cfg->attr_count); +#ifdef LFS_READONLY + LFS_ASSERT((flags & 3) == LFS_O_RDONLY); +#else // deorphan if we haven't yet, needed at most once after poweron if ((flags & 3) != LFS_O_RDONLY) { -#ifdef LFS_READONLY - return LFS_ERR_INVAL; -#else int err = lfs_fs_forceconsistency(lfs); if (err) { LFS_TRACE("lfs_file_opencfg -> %d", err); return err; } -#endif } +#endif // setup simple file details int err; @@ -2471,11 +2469,12 @@ int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, file->next = (lfs_file_t*)lfs->mlist; lfs->mlist = (struct lfs_mlist*)file; - if (tag == LFS_ERR_NOENT) { #ifdef LFS_READONLY + if (tag == LFS_ERR_NOENT) { err = LFS_ERR_NOENT; goto cleanup; #else + if (tag == LFS_ERR_NOENT) { if (!(flags & LFS_O_CREAT)) { err = LFS_ERR_NOENT; goto cleanup; @@ -2499,17 +2498,19 @@ int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, } tag = LFS_MKTAG(LFS_TYPE_INLINESTRUCT, 0, 0); -#endif } else if (flags & LFS_O_EXCL) { err = LFS_ERR_EXIST; goto cleanup; +#endif } else if (lfs_tag_type3(tag) != LFS_TYPE_REG) { err = LFS_ERR_ISDIR; goto cleanup; +#ifndef LFS_READONLY } else if (flags & LFS_O_TRUNC) { // truncate if requested tag = LFS_MKTAG(LFS_TYPE_INLINESTRUCT, file->id, 0); file->flags |= LFS_F_DIRTY; +#endif } else { // try to load what's on disk, if it's inlined we'll fix it later tag = lfs_dir_get(lfs, &file->m, LFS_MKTAG(0x700, 0x3ff, 0), @@ -2523,7 +2524,8 @@ int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, // fetch attrs for (unsigned i = 0; i < file->cfg->attr_count; i++) { - if ((file->flags & 3) != LFS_O_WRONLY) { + // if opened for read / read-write operations + if ((file->flags & LFS_O_RDONLY) == LFS_O_RDONLY) { lfs_stag_t res = lfs_dir_get(lfs, &file->m, LFS_MKTAG(0x7ff, 0x3ff, 0), LFS_MKTAG(LFS_TYPE_USERATTR + file->cfg->attrs[i].type, @@ -2535,7 +2537,9 @@ int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, } } - if ((file->flags & 3) != LFS_O_RDONLY) { +#ifndef LFS_READONLY + // if opened for write / read-write operations + if ((file->flags & LFS_O_WRONLY) == LFS_O_WRONLY) { if (file->cfg->attrs[i].size > lfs->attr_max) { err = LFS_ERR_NOSPC; goto cleanup; @@ -2543,6 +2547,7 @@ int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, file->flags |= LFS_F_DIRTY; } +#endif } // allocate buffer if needed @@ -2587,7 +2592,9 @@ int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, cleanup: // clean up lingering resources +#ifndef LFS_READONLY file->flags |= LFS_F_ERRED; +#endif lfs_file_close(lfs, file); LFS_TRACE("lfs_file_opencfg -> %d", err); return err; @@ -2607,7 +2614,11 @@ int lfs_file_close(lfs_t *lfs, lfs_file_t *file) { LFS_TRACE("lfs_file_close(%p, %p)", (void*)lfs, (void*)file); LFS_ASSERT(file->flags & LFS_F_OPENED); +#ifdef LFS_READONLY + int err = 0; +#else int err = lfs_file_sync(lfs, file); +#endif // remove from list of mdirs for (struct lfs_mlist **p = &lfs->mlist; *p; p = &(*p)->next) { @@ -2715,6 +2726,7 @@ static int lfs_file_outline(lfs_t *lfs, lfs_file_t *file) { } #endif +#ifndef LFS_READONLY static int lfs_file_flush(lfs_t *lfs, lfs_file_t *file) { LFS_ASSERT(file->flags & LFS_F_OPENED); @@ -2725,7 +2737,6 @@ static int lfs_file_flush(lfs_t *lfs, lfs_file_t *file) { file->flags &= ~LFS_F_READING; } -#ifndef LFS_READONLY if (file->flags & LFS_F_WRITING) { lfs_off_t pos = file->pos; @@ -2792,11 +2803,12 @@ relocate: file->pos = pos; } -#endif return 0; } +#endif +#ifndef LFS_READONLY int lfs_file_sync(lfs_t *lfs, lfs_file_t *file) { LFS_TRACE("lfs_file_sync(%p, %p)", (void*)lfs, (void*)file); LFS_ASSERT(file->flags & LFS_F_OPENED); @@ -2815,7 +2827,6 @@ int lfs_file_sync(lfs_t *lfs, lfs_file_t *file) { } -#ifndef LFS_READONLY if ((file->flags & LFS_F_DIRTY) && !lfs_pair_isnull(file->m.pair)) { // update dir entry @@ -2851,18 +2862,22 @@ int lfs_file_sync(lfs_t *lfs, lfs_file_t *file) { file->flags &= ~LFS_F_DIRTY; } -#endif LFS_TRACE("lfs_file_sync -> %d", 0); return 0; } +#endif lfs_ssize_t lfs_file_read(lfs_t *lfs, lfs_file_t *file, void *buffer, lfs_size_t size) { LFS_TRACE("lfs_file_read(%p, %p, %p, %"PRIu32")", (void*)lfs, (void*)file, buffer, size); LFS_ASSERT(file->flags & LFS_F_OPENED); +#ifdef LFS_READONLY + // always LFS_O_RDONLY +#else LFS_ASSERT((file->flags & 3) != LFS_O_WRONLY); +#endif uint8_t *data = buffer; lfs_size_t nsize = size; @@ -2939,6 +2954,7 @@ lfs_ssize_t lfs_file_read(lfs_t *lfs, lfs_file_t *file, return size; } +#ifndef LFS_READONLY lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, const void *buffer, lfs_size_t size) { LFS_TRACE("lfs_file_write(%p, %p, %p, %"PRIu32")", @@ -2946,10 +2962,6 @@ lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, LFS_ASSERT(file->flags & LFS_F_OPENED); LFS_ASSERT((file->flags & 3) != LFS_O_RDONLY); - -#ifdef LFS_READONLY - return LFS_ERR_NOSYS; -#else const uint8_t *data = buffer; lfs_size_t nsize = size; @@ -3072,8 +3084,8 @@ relocate: file->flags &= ~LFS_F_ERRED; LFS_TRACE("lfs_file_write -> %"PRId32, size); return size; -#endif } +#endif lfs_soff_t lfs_file_seek(lfs_t *lfs, lfs_file_t *file, lfs_soff_t off, int whence) { @@ -3081,12 +3093,14 @@ lfs_soff_t lfs_file_seek(lfs_t *lfs, lfs_file_t *file, (void*)lfs, (void*)file, off, whence); LFS_ASSERT(file->flags & LFS_F_OPENED); +#ifndef LFS_READONLY // write out everything beforehand, may be noop if rdonly int err = lfs_file_flush(lfs, file); if (err) { LFS_TRACE("lfs_file_seek -> %d", err); return err; } +#endif // find new pos lfs_off_t npos = file->pos; @@ -3110,6 +3124,7 @@ lfs_soff_t lfs_file_seek(lfs_t *lfs, lfs_file_t *file, return npos; } +#ifndef LFS_READONLY int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size) { LFS_TRACE("lfs_file_truncate(%p, %p, %"PRIu32")", (void*)lfs, (void*)file, size); @@ -3121,9 +3136,6 @@ int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size) { return LFS_ERR_INVAL; } -#ifdef LFS_READONLY - return LFS_ERR_NOSYS; -#else lfs_off_t pos = file->pos; lfs_off_t oldsize = lfs_file_size(lfs, file); if (size < oldsize) { @@ -3175,8 +3187,8 @@ int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size) { LFS_TRACE("lfs_file_truncate -> %d", 0); return 0; -#endif } +#endif lfs_soff_t lfs_file_tell(lfs_t *lfs, lfs_file_t *file) { LFS_TRACE("lfs_file_tell(%p, %p)", (void*)lfs, (void*)file); @@ -3208,12 +3220,10 @@ lfs_soff_t lfs_file_size(lfs_t *lfs, lfs_file_t *file) { LFS_TRACE("lfs_file_size -> %"PRId32, lfs_max(file->pos, file->ctz.size)); return lfs_max(file->pos, file->ctz.size); - } else -#endif - { - LFS_TRACE("lfs_file_size -> %"PRId32, file->ctz.size); - return file->ctz.size; } +#endif + LFS_TRACE("lfs_file_size -> %"PRId32, file->ctz.size); + return file->ctz.size; } @@ -3232,12 +3242,10 @@ int lfs_stat(lfs_t *lfs, const char *path, struct lfs_info *info) { return err; } +#ifndef LFS_READONLY int lfs_remove(lfs_t *lfs, const char *path) { LFS_TRACE("lfs_remove(%p, \"%s\")", (void*)lfs, path); -#ifdef LFS_READONLY - return LFS_ERR_NOSYS; -#else // deorphan if we haven't yet, needed at most once after poweron int err = lfs_fs_forceconsistency(lfs); if (err) { @@ -3315,15 +3323,13 @@ int lfs_remove(lfs_t *lfs, const char *path) { LFS_TRACE("lfs_remove -> %d", 0); return 0; -#endif } +#endif +#ifndef LFS_READONLY int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) { LFS_TRACE("lfs_rename(%p, \"%s\", \"%s\")", (void*)lfs, oldpath, newpath); -#ifdef LFS_READONLY - return LFS_ERR_NOSYS; -#else // deorphan if we haven't yet, needed at most once after poweron int err = lfs_fs_forceconsistency(lfs); if (err) { @@ -3464,8 +3470,8 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) { LFS_TRACE("lfs_rename -> %d", 0); return 0; -#endif } +#endif lfs_ssize_t lfs_getattr(lfs_t *lfs, const char *path, uint8_t type, void *buffer, lfs_size_t size) { @@ -3532,13 +3538,11 @@ static int lfs_commitattr(lfs_t *lfs, const char *path, } #endif +#ifndef LFS_READONLY int lfs_setattr(lfs_t *lfs, const char *path, uint8_t type, const void *buffer, lfs_size_t size) { LFS_TRACE("lfs_setattr(%p, \"%s\", %"PRIu8", %p, %"PRIu32")", (void*)lfs, path, type, buffer, size); -#ifdef LFS_READONLY - return LFS_ERR_NOSYS; -#else if (size > lfs->attr_max) { LFS_TRACE("lfs_setattr -> %d", LFS_ERR_NOSPC); return LFS_ERR_NOSPC; @@ -3547,19 +3551,17 @@ int lfs_setattr(lfs_t *lfs, const char *path, int err = lfs_commitattr(lfs, path, type, buffer, size); LFS_TRACE("lfs_setattr -> %d", err); return err; -#endif } +#endif +#ifndef LFS_READONLY int lfs_removeattr(lfs_t *lfs, const char *path, uint8_t type) { LFS_TRACE("lfs_removeattr(%p, \"%s\", %"PRIu8")", (void*)lfs, path, type); -#ifdef LFS_READONLY - return LFS_ERR_NOSYS; -#else int err = lfs_commitattr(lfs, path, type, NULL, 0x3ff); LFS_TRACE("lfs_removeattr -> %d", err); return err; -#endif } +#endif /// Filesystem operations /// @@ -3687,6 +3689,7 @@ static int lfs_deinit(lfs_t *lfs) { return 0; } +#ifndef LFS_READONLY int lfs_format(lfs_t *lfs, const struct lfs_config *cfg) { LFS_TRACE("lfs_format(%p, %p {.context=%p, " ".read=%p, .prog=%p, .erase=%p, .sync=%p, " @@ -3705,9 +3708,6 @@ int lfs_format(lfs_t *lfs, const struct lfs_config *cfg) { cfg->read_buffer, cfg->prog_buffer, cfg->lookahead_buffer, cfg->name_max, cfg->file_max, cfg->attr_max); -#ifdef LFS_READONLY - return LFS_ERR_NOSYS; -#else int err = 0; { err = lfs_init(lfs, cfg); @@ -3771,8 +3771,8 @@ cleanup: LFS_TRACE("lfs_format -> %d", err); return err; -#endif } +#endif int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) { LFS_TRACE("lfs_mount(%p, %p {.context=%p, " @@ -3997,6 +3997,7 @@ int lfs_fs_traverseraw(lfs_t *lfs, } } +#ifndef LFS_READONLY // iterate over any open files for (lfs_file_t *f = (lfs_file_t*)lfs->mlist; f; f = f->next) { if (f->type != LFS_TYPE_REG) { @@ -4011,7 +4012,6 @@ int lfs_fs_traverseraw(lfs_t *lfs, } } -#ifndef LFS_READONLY if ((f->flags & LFS_F_WRITING) && !(f->flags & LFS_F_INLINE)) { int err = lfs_ctz_traverse(lfs, &f->cache, &lfs->rcache, f->block, f->pos, cb, data); @@ -4019,8 +4019,8 @@ int lfs_fs_traverseraw(lfs_t *lfs, return err; } } -#endif } +#endif return 0; } diff --git a/lfs.h b/lfs.h index e271a23..67a3f32 100644 --- a/lfs.h +++ b/lfs.h @@ -76,7 +76,6 @@ enum lfs_error { LFS_ERR_EXIST = -17, // Entry already exists LFS_ERR_NOTDIR = -20, // Entry is not a dir LFS_ERR_ISDIR = -21, // Entry is a dir - LFS_ERR_NOSYS = -38, // Function not implemened LFS_ERR_NOTEMPTY = -39, // Dir is not empty LFS_ERR_BADF = -9, // Bad file number LFS_ERR_FBIG = -27, // File too large @@ -124,18 +123,24 @@ enum lfs_type { enum lfs_open_flags { // open flags LFS_O_RDONLY = 1, // Open a file as read only +#ifndef LFS_READONLY LFS_O_WRONLY = 2, // Open a file as write only LFS_O_RDWR = 3, // Open a file as read and write LFS_O_CREAT = 0x0100, // Create a file if it does not exist LFS_O_EXCL = 0x0200, // Fail if a file already exists LFS_O_TRUNC = 0x0400, // Truncate the existing file to zero size LFS_O_APPEND = 0x0800, // Move to end of file on every write +#endif // internally used flags +#ifndef LFS_READONLY LFS_F_DIRTY = 0x010000, // File does not match storage LFS_F_WRITING = 0x020000, // File has been written since last flush +#endif LFS_F_READING = 0x040000, // File has been read since last flush - LFS_F_ERRED = 0x080000, // An error occured during write +#ifndef LFS_READONLY + LFS_F_ERRED = 0x080000, // An error occurred during write +#endif LFS_F_INLINE = 0x100000, // Currently inlined in directory entry LFS_F_OPENED = 0x200000, // File has been opened }; @@ -400,6 +405,7 @@ typedef struct lfs { /// Filesystem functions /// +#ifndef LFS_READONLY // Format a block device with the littlefs // // Requires a littlefs object and config struct. This clobbers the littlefs @@ -408,6 +414,7 @@ typedef struct lfs { // // Returns a negative error code on failure. int lfs_format(lfs_t *lfs, const struct lfs_config *config); +#endif // Mounts a littlefs // @@ -427,12 +434,15 @@ int lfs_unmount(lfs_t *lfs); /// General operations /// +#ifndef LFS_READONLY // Removes a file or directory // // If removing a directory, the directory must be empty. // Returns a negative error code on failure. int lfs_remove(lfs_t *lfs, const char *path); +#endif +#ifndef LFS_READONLY // Rename or move a file or directory // // If the destination exists, it must match the source in type. @@ -440,6 +450,7 @@ int lfs_remove(lfs_t *lfs, const char *path); // // Returns a negative error code on failure. int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath); +#endif // Find info about a file or directory // @@ -462,6 +473,7 @@ int lfs_stat(lfs_t *lfs, const char *path, struct lfs_info *info); lfs_ssize_t lfs_getattr(lfs_t *lfs, const char *path, uint8_t type, void *buffer, lfs_size_t size); +#ifndef LFS_READONLY // Set custom attributes // // Custom attributes are uniquely identified by an 8-bit type and limited @@ -471,13 +483,16 @@ lfs_ssize_t lfs_getattr(lfs_t *lfs, const char *path, // Returns a negative error code on failure. int lfs_setattr(lfs_t *lfs, const char *path, uint8_t type, const void *buffer, lfs_size_t size); +#endif +#ifndef LFS_READONLY // Removes a custom attribute // // If an attribute is not found, nothing happens. // // Returns a negative error code on failure. int lfs_removeattr(lfs_t *lfs, const char *path, uint8_t type); +#endif /// File operations /// @@ -526,6 +541,7 @@ int lfs_file_sync(lfs_t *lfs, lfs_file_t *file); lfs_ssize_t lfs_file_read(lfs_t *lfs, lfs_file_t *file, void *buffer, lfs_size_t size); +#ifndef LFS_READONLY // Write data to file // // Takes a buffer and size indicating the data to write. The file will not @@ -534,6 +550,7 @@ lfs_ssize_t lfs_file_read(lfs_t *lfs, lfs_file_t *file, // Returns the number of bytes written, or a negative error code on failure. lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, const void *buffer, lfs_size_t size); +#endif // Change the position of the file // @@ -542,10 +559,12 @@ lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, lfs_soff_t lfs_file_seek(lfs_t *lfs, lfs_file_t *file, lfs_soff_t off, int whence); +#ifndef LFS_READONLY // Truncates the size of the file to the specified size // // Returns a negative error code on failure. int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size); +#endif // Return the position of the file // @@ -568,10 +587,12 @@ lfs_soff_t lfs_file_size(lfs_t *lfs, lfs_file_t *file); /// Directory operations /// +#ifndef LFS_READONLY // Create a directory // // Returns a negative error code on failure. int lfs_mkdir(lfs_t *lfs, const char *path); +#endif // Open a directory // @@ -633,6 +654,7 @@ lfs_ssize_t lfs_fs_size(lfs_t *lfs); // Returns a negative error code on failure. int lfs_fs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data); +#ifndef LFS_READONLY #ifdef LFS_MIGRATE // Attempts to migrate a previous version of littlefs // @@ -647,6 +669,7 @@ int lfs_fs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data); // Returns a negative error code on failure. int lfs_migrate(lfs_t *lfs, const struct lfs_config *cfg); #endif +#endif #ifdef __cplusplus