mirror of
https://github.com/pellepl/spiffs.git
synced 2026-09-09 10:40:06 +00:00
exposed SPIFFS_open_by_page function
This commit is contained in:
+19
-2
@@ -49,6 +49,8 @@ extern "C" {
|
||||
|
||||
#define SPIFFS_ERR_FILE_EXISTS -10030
|
||||
|
||||
#define SPIFFS_ERR_NOT_A_FILE -10031
|
||||
|
||||
#define SPIFFS_ERR_INTERNAL -10050
|
||||
|
||||
#define SPIFFS_ERR_TEST -10100
|
||||
@@ -326,14 +328,13 @@ s32_t SPIFFS_creat(spiffs *fs, const char *path, spiffs_mode mode);
|
||||
*/
|
||||
spiffs_file SPIFFS_open(spiffs *fs, const char *path, spiffs_flags flags, spiffs_mode mode);
|
||||
|
||||
|
||||
/**
|
||||
* Opens a file by given dir entry.
|
||||
* Optimization purposes, when traversing a file system with SPIFFS_readdir
|
||||
* a normal SPIFFS_open would need to traverse the filesystem again to find
|
||||
* the file, whilst SPIFFS_open_by_dirent already knows where the file resides.
|
||||
* @param fs the file system struct
|
||||
* @param path the dir entry to the file
|
||||
* @param e the dir entry to the file
|
||||
* @param flags the flags for the open command, can be combinations of
|
||||
* SPIFFS_APPEND, SPIFFS_TRUNC, SPIFFS_CREAT, SPIFFS_RD_ONLY,
|
||||
* SPIFFS_WR_ONLY, SPIFFS_RDWR, SPIFFS_DIRECT.
|
||||
@@ -342,6 +343,22 @@ spiffs_file SPIFFS_open(spiffs *fs, const char *path, spiffs_flags flags, spiffs
|
||||
*/
|
||||
spiffs_file SPIFFS_open_by_dirent(spiffs *fs, struct spiffs_dirent *e, spiffs_flags flags, spiffs_mode mode);
|
||||
|
||||
/**
|
||||
* Opens a file by given page index.
|
||||
* Optimization purposes, opens a file by directly pointing to the page
|
||||
* index in the spi flash.
|
||||
* If the page index does not point to a file header SPIFFS_ERR_NOT_A_FILE
|
||||
* is returned.
|
||||
* @param fs the file system struct
|
||||
* @param page_ix the page index
|
||||
* @param flags the flags for the open command, can be combinations of
|
||||
* SPIFFS_APPEND, SPIFFS_TRUNC, SPIFFS_CREAT, SPIFFS_RD_ONLY,
|
||||
* SPIFFS_WR_ONLY, SPIFFS_RDWR, SPIFFS_DIRECT.
|
||||
* SPIFFS_CREAT will have no effect in this case.
|
||||
* @param mode ignored, for posix compliance
|
||||
*/
|
||||
spiffs_file SPIFFS_open_by_page(spiffs *fs, spiffs_page_ix page_ix, spiffs_flags flags, spiffs_mode mode);
|
||||
|
||||
/**
|
||||
* Reads from given filehandle.
|
||||
* @param fs the file system struct
|
||||
|
||||
@@ -280,6 +280,49 @@ spiffs_file SPIFFS_open_by_dirent(spiffs *fs, struct spiffs_dirent *e, spiffs_fl
|
||||
return SPIFFS_FH_OFFS(fs, fd->file_nbr);
|
||||
}
|
||||
|
||||
spiffs_file SPIFFS_open_by_page(spiffs *fs, spiffs_page_ix page_ix, spiffs_flags flags, spiffs_mode mode) {
|
||||
SPIFFS_API_CHECK_CFG(fs);
|
||||
SPIFFS_API_CHECK_MOUNT(fs);
|
||||
SPIFFS_LOCK(fs);
|
||||
|
||||
spiffs_fd *fd;
|
||||
|
||||
s32_t res = spiffs_fd_find_new(fs, &fd);
|
||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||
|
||||
if (SPIFFS_IS_LOOKUP_PAGE(fs, page_ix)) {
|
||||
res = SPIFFS_ERR_NOT_A_FILE;
|
||||
spiffs_fd_return(fs, fd->file_nbr);
|
||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||
}
|
||||
|
||||
res = spiffs_object_open_by_page(fs, page_ix, fd, flags, mode);
|
||||
if (res == SPIFFS_ERR_IS_FREE ||
|
||||
res == SPIFFS_ERR_DELETED ||
|
||||
res == SPIFFS_ERR_NOT_FINALIZED ||
|
||||
res == SPIFFS_ERR_NOT_INDEX ||
|
||||
res == SPIFFS_ERR_INDEX_SPAN_MISMATCH) {
|
||||
res = SPIFFS_ERR_NOT_A_FILE;
|
||||
}
|
||||
if (res < SPIFFS_OK) {
|
||||
spiffs_fd_return(fs, fd->file_nbr);
|
||||
}
|
||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||
if (flags & SPIFFS_TRUNC) {
|
||||
res = spiffs_object_truncate(fd, 0, 0);
|
||||
if (res < SPIFFS_OK) {
|
||||
spiffs_fd_return(fs, fd->file_nbr);
|
||||
}
|
||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||
}
|
||||
|
||||
fd->fdoffset = 0;
|
||||
|
||||
SPIFFS_UNLOCK(fs);
|
||||
|
||||
return SPIFFS_FH_OFFS(fs, fd->file_nbr);
|
||||
}
|
||||
|
||||
s32_t SPIFFS_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len) {
|
||||
SPIFFS_API_CHECK_CFG(fs);
|
||||
SPIFFS_API_CHECK_MOUNT(fs);
|
||||
|
||||
@@ -359,6 +359,70 @@ TEST(open_by_dirent) {
|
||||
} TEST_END(open_by_dirent)
|
||||
|
||||
|
||||
TEST(open_by_page) {
|
||||
int res;
|
||||
|
||||
char *files[4] = {
|
||||
"file1",
|
||||
"file2",
|
||||
"file3",
|
||||
"file4"
|
||||
};
|
||||
int file_cnt = sizeof(files)/sizeof(char *);
|
||||
|
||||
int i;
|
||||
int size = SPIFFS_DATA_PAGE_SIZE(FS);
|
||||
|
||||
for (i = 0; i < file_cnt; i++) {
|
||||
res = test_create_and_write_file(files[i], size, size);
|
||||
TEST_CHECK(res >= 0);
|
||||
}
|
||||
|
||||
spiffs_DIR d;
|
||||
struct spiffs_dirent e;
|
||||
struct spiffs_dirent *pe = &e;
|
||||
|
||||
int found = 0;
|
||||
SPIFFS_opendir(FS, "/", &d);
|
||||
while ((pe = SPIFFS_readdir(&d, pe))) {
|
||||
spiffs_file fd = SPIFFS_open_by_dirent(FS, pe, SPIFFS_RDWR, 0);
|
||||
TEST_CHECK(fd >= 0);
|
||||
res = read_and_verify_fd(fd, pe->name);
|
||||
TEST_CHECK(res == SPIFFS_OK);
|
||||
fd = SPIFFS_open_by_page(FS, pe->pix, SPIFFS_RDWR, 0);
|
||||
TEST_CHECK(fd >= 0);
|
||||
res = SPIFFS_fremove(FS, fd);
|
||||
TEST_CHECK(res == SPIFFS_OK);
|
||||
SPIFFS_close(FS, fd);
|
||||
found++;
|
||||
}
|
||||
SPIFFS_closedir(&d);
|
||||
|
||||
TEST_CHECK(found == file_cnt);
|
||||
|
||||
found = 0;
|
||||
SPIFFS_opendir(FS, "/", &d);
|
||||
while ((pe = SPIFFS_readdir(&d, pe))) {
|
||||
found++;
|
||||
}
|
||||
SPIFFS_closedir(&d);
|
||||
|
||||
TEST_CHECK(found == 0);
|
||||
|
||||
spiffs_file fd;
|
||||
// test opening a lookup page
|
||||
fd = SPIFFS_open_by_page(FS, 0, SPIFFS_RDWR, 0);
|
||||
TEST_CHECK_LT(fd, 0);
|
||||
TEST_CHECK_EQ(SPIFFS_errno(FS), SPIFFS_ERR_NOT_A_FILE);
|
||||
// test opening a proper page but not being object index
|
||||
fd = SPIFFS_open_by_page(FS, SPIFFS_OBJ_LOOKUP_PAGES(FS)+1, SPIFFS_RDWR, 0);
|
||||
TEST_CHECK_LT(fd, 0);
|
||||
TEST_CHECK_EQ(SPIFFS_errno(FS), SPIFFS_ERR_NOT_A_FILE);
|
||||
|
||||
return TEST_RES_OK;
|
||||
} TEST_END(open_by_page)
|
||||
|
||||
|
||||
TEST(rename) {
|
||||
int res;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user