From 2c1079d0f47a762b2b194d3a48cf23d649246fc0 Mon Sep 17 00:00:00 2001 From: "S.J.R. van Schaik" Date: Mon, 12 Jun 2017 12:53:20 +0200 Subject: [PATCH] mufs: implement modes for read, write and append in mufs_open() --- include/fs/mufs.h | 6 +++++- source/fs/mufs/file.c | 13 ++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/include/fs/mufs.h b/include/fs/mufs.h index 9e02382..ae3f147 100644 --- a/include/fs/mufs.h +++ b/include/fs/mufs.h @@ -26,6 +26,10 @@ struct mufs_dirent { uint8_t type; }; +#define MUFS_READ BIT(0) +#define MUFS_WRITE BIT(1) +#define MUFS_APPEND BIT(2) + int mufs_mount(struct mufs *fs, struct flash_dev *dev); int mufs_format(struct flash_dev *dev); @@ -36,7 +40,7 @@ int mufs_readdir(struct mufs_dir *dir, struct mufs_dirent *dirent); int mufs_mkdir(struct mufs *fs, const char *path); int mufs_create(struct mufs *fs, const char *path); -struct mufs_file *mufs_open(struct mufs *fs, const char *path); +struct mufs_file *mufs_open(struct mufs *fs, const char *path, int mode); void mufs_close(struct mufs_file *file); size_t mufs_read(struct mufs_file *file, void *data, size_t len); size_t mufs_write(struct mufs_file *file, const void *data, size_t len); diff --git a/source/fs/mufs/file.c b/source/fs/mufs/file.c index baca57f..60a24be 100644 --- a/source/fs/mufs/file.c +++ b/source/fs/mufs/file.c @@ -15,6 +15,7 @@ struct mufs_file { struct mufs *fs; struct mufs_tree *tree; + int mode; uint32_t va; }; @@ -23,7 +24,7 @@ int mufs_create(struct mufs *fs, const char *path) return mufs_mkpath(fs, path, MUFS_FILE); } -struct mufs_file *mufs_open(struct mufs *fs, const char *path) +struct mufs_file *mufs_open(struct mufs *fs, const char *path, int mode) { struct mufs_file *file; @@ -35,6 +36,7 @@ struct mufs_file *mufs_open(struct mufs *fs, const char *path) if (!(file->tree = resolve_path(fs, path))) goto err_free_file; + file->mode = mode; file->va = 0; return file; @@ -59,6 +61,9 @@ size_t mufs_read(struct mufs_file *file, void *data, size_t len) if (!file || !data || !len) return 0; + if (!(file->mode & MUFS_READ)) + return 0; + if (!(ret = mufs_tree_read(file->tree, data, file->va, len))) return 0; @@ -74,6 +79,12 @@ size_t mufs_write(struct mufs_file *file, const void *data, size_t len) if (!file || !data || !len) return 0; + if (!(file->mode & MUFS_WRITE)) + return 0; + + if (file->mode & MUFS_APPEND) + file->va = file->tree->file_size; + if (!(ret = mufs_tree_write(file->tree, (void *)data, file->va, len))) return 0;