diff --git a/os/vfs/include/vfs.h b/os/vfs/include/vfs.h
index b71a9fbe4..d57d4e3a3 100644
--- a/os/vfs/include/vfs.h
+++ b/os/vfs/include/vfs.h
@@ -79,6 +79,7 @@
/* Base VFS headers.*/
#include "vfserrors.h"
+#include "vfsparser.h"
#include "vfsnodes.h"
#include "vfsdrivers.h"
#include "vfssystem.h"
diff --git a/os/vfs/include/vfsdrivers.h b/os/vfs/include/vfsdrivers.h
index 6a194310a..fad69c093 100644
--- a/os/vfs/include/vfsdrivers.h
+++ b/os/vfs/include/vfsdrivers.h
@@ -56,8 +56,8 @@ typedef struct vfs_driver vfs_driver_t;
_base_object_methods \
/* Returns a pointer to the driver name constant.*/ \
const char *(*get_name)(void); \
- vfserr_t (*open_dir)(const char *path, vfs_directory_node_t **vdnpp); \
- vfserr_t (*open_file)(const char *path, vfs_file_node_t **vfnpp);
+ msg_t (*open_dir)(const char *path, vfs_directory_node_t **vdnpp); \
+ msg_t (*open_file)(const char *path, vfs_file_node_t **vfnpp);
/**
* @brief @p vfs_node_t specific data.
diff --git a/os/vfs/include/vfserrors.h b/os/vfs/include/vfserrors.h
index 2e6589589..08cb33a5c 100644
--- a/os/vfs/include/vfserrors.h
+++ b/os/vfs/include/vfserrors.h
@@ -32,6 +32,18 @@
/* Module constants. */
/*===========================================================================*/
+/**
+ * @brief Error codes compatible with @p msg_t
+ * @{
+ */
+#define VFS_RET_SUCCESS MSG_OK
+#define VFS_RET_NO_RESOURCE (msg_t)-3
+#define VFS_RET_NO_DRIVER (msg_t)-4
+#define VFS_RET_INVALID_PATH (msg_t)-5
+#define VFS_RET_NOT_FOUND (msg_t)-6
+#define VFS_RET_EOF (msg_t)-7
+/** @} */
+
/*===========================================================================*/
/* Module pre-compile time settings. */
/*===========================================================================*/
@@ -44,22 +56,13 @@
/* Module data structures and types. */
/*===========================================================================*/
-/**
- * @brief Type of a VFS error code.
- */
-typedef enum {
- VFS_RET_SUCCESS = 0,
- VFS_RET_NO_RESOURCE = -3,
- VFS_RET_NO_DRIVER = -4,
- VFS_RET_INVALID_PATH = -5,
- VFS_RET_NOT_FOUND = -6,
- VFS_RET_EOF = -7
-} vfserr_t;
-
/*===========================================================================*/
/* Module macros. */
/*===========================================================================*/
+#define VFS_BREAK_ON_ERROR(err) \
+ if ((err) < VFS_RET_SUCCESS) break
+
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
diff --git a/os/vfs/include/vfsnodes.h b/os/vfs/include/vfsnodes.h
index 924fbbbb1..b1efe76b9 100644
--- a/os/vfs/include/vfsnodes.h
+++ b/os/vfs/include/vfsnodes.h
@@ -87,7 +87,6 @@ typedef struct vfs_node_info {
char name[VFS_CFG_MAX_NAMELEN + 1];
} vfs_node_info_t;
-
/**
* @brief Type of a structure representing a generic VFS node.
*/
@@ -151,8 +150,8 @@ typedef struct vfs_directory_node vfs_directory_node_t;
*/
struct vfs_directory_node_vmt {
__vfs_directory_node_methods \
- vfserr_t (*dir_first)(void *instance); \
- vfserr_t (*dir_next)(void *instance);
+ msg_t (*dir_first)(void *instance); \
+ msg_t (*dir_next)(void *instance);
};
/**
@@ -176,9 +175,9 @@ typedef struct vfs_file_node vfs_file_node_t;
*/
#define __vfs_file_node_methods \
__vfs_node_methods \
- vfserr_t (*file_read)(void *instance, char *buf, size_t n); \
- vfserr_t (*file_write)(void *instance, const char *buf, size_t n); \
- vfserr_t (*file_setpos)(void *instance, vfs_offset_t offset); \
+ msg_t (*file_read)(void *instance, uint8_t *buf, size_t n); \
+ msg_t (*file_write)(void *instance, const uint8_t *buf, size_t n); \
+ msg_t (*file_setpos)(void *instance, vfs_offset_t offset); \
vfs_offset_t (*file_getpos)(void *instance); \
vfs_offset_t (*file_getsize)(void *instance);
diff --git a/os/vfs/include/vfsparser.h b/os/vfs/include/vfsparser.h
new file mode 100644
index 000000000..2d2e0a106
--- /dev/null
+++ b/os/vfs/include/vfsparser.h
@@ -0,0 +1,66 @@
+/*
+ ChibiOS - Copyright (C) 2006,2007,2008,2009,2010,2011,2012,2013,2014,
+ 2015,2016,2017,2018,2019,2020,2021 Giovanni Di Sirio.
+
+ This file is part of ChibiOS.
+
+ ChibiOS is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation version 3 of the License.
+
+ ChibiOS is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+/**
+ * @file vfs/include/vfsparser.h
+ * @brief VFS parser utilities header file.
+ *
+ * @addtogroup VFS_PARSE
+ * @{
+ */
+
+#ifndef VFSPARSE_H
+#define VFSPARSE_H
+
+/*===========================================================================*/
+/* Module constants. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module pre-compile time settings. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Derived constants and error checks. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module data structures and types. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module macros. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* External declarations. */
+/*===========================================================================*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ msg_t vfs_parse_separator(const char **pathp);
+ msg_t vfs_parse_filename(const char **pathp, char *fname);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* VFSPARSE_H */
+
+/** @} */
diff --git a/os/vfs/include/vfssystem.h b/os/vfs/include/vfssystem.h
index 8b4f8351e..4341a6407 100644
--- a/os/vfs/include/vfssystem.h
+++ b/os/vfs/include/vfssystem.h
@@ -116,14 +116,14 @@ extern vfs_system_t vfs;
extern "C" {
#endif
void vfsInit(void);
- vfserr_t vfsRegisterDriver(vfs_driver_t *vdp);
- vfserr_t vfsOpenDirectory(const char *name, vfs_directory_node_t **vdnpp);
+ msg_t vfsRegisterDriver(vfs_driver_t *vdp);
+ msg_t vfsOpenDirectory(const char *name, vfs_directory_node_t **vdnpp);
void vfsCloseDirectory(vfs_directory_node_t *vdnp);
- vfserr_t vfsOpenFile(const char *name, vfs_file_node_t **vfnpp);
+ msg_t vfsOpenFile(const char *name, vfs_file_node_t **vfnpp);
void vfsCloseFile(vfs_file_node_t *vfnp);
- vfserr_t vfsReadFile(vfs_file_node_t *vfnp, char *buf, size_t n);
- vfserr_t vfsWriteFile(vfs_file_node_t *vfnp, const char *buf, size_t n);
- vfserr_t vfsSetFilePosition(vfs_file_node_t *vfnp, vfs_offset_t offset);
+ msg_t vfsReadFile(vfs_file_node_t *vfnp, uint8_t *buf, size_t n);
+ msg_t vfsWriteFile(vfs_file_node_t *vfnp, const uint8_t *buf, size_t n);
+ msg_t vfsSetFilePosition(vfs_file_node_t *vfnp, vfs_offset_t offset);
vfs_offset_t vfsGetFilePosition(vfs_file_node_t *vfnp);
vfs_offset_t vfsGetFileSize(vfs_file_node_t *vfnp);
#ifdef __cplusplus
diff --git a/os/vfs/src/vfsparser.c b/os/vfs/src/vfsparser.c
new file mode 100644
index 000000000..92b47abce
--- /dev/null
+++ b/os/vfs/src/vfsparser.c
@@ -0,0 +1,99 @@
+/*
+ ChibiOS - Copyright (C) 2006,2007,2008,2009,2010,2011,2012,2013,2014,
+ 2015,2016,2017,2018,2019,2020,2021 Giovanni Di Sirio.
+
+ This file is part of ChibiOS.
+
+ ChibiOS is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation version 3 of the License.
+
+ ChibiOS is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+/**
+ * @file vfs/src/chparser.c
+ * @brief VFS parser utilities code.
+ *
+ * @addtogroup VFS_PARSE
+ * @{
+ */
+
+#include
+
+#include "vfs.h"
+
+/*===========================================================================*/
+/* Module local definitions. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module exported variables. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module local types. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module local variables. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module local functions. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module exported functions. */
+/*===========================================================================*/
+
+msg_t vfs_parse_separator(const char **pathp) {
+ msg_t err;
+ const char *p = *pathp;
+
+ if (*p++ != '/') {
+ err = VFS_RET_INVALID_PATH;
+ }
+ else {
+ err = VFS_RET_SUCCESS;
+ *pathp = p;
+ }
+
+ return err;
+}
+
+
+msg_t vfs_parse_filename(const char **pathp, char *fname) {
+ msg_t err;
+ size_t n;
+ const char *p = *pathp;
+
+ n = 0U;
+ while (true) {
+ char c = *p++;
+ if ((c == '\0') || (c == '/')) {
+ *pathp = p;
+ *fname = '\0';
+ err = VFS_RET_SUCCESS;
+ break;
+ }
+
+ if (n > VFS_CFG_MAX_NAMELEN) {
+ err = VFS_RET_INVALID_PATH;
+ break;
+ }
+
+ *fname++ = c;
+ n++;
+ }
+
+ return err;
+}
+
+/** @} */
diff --git a/os/vfs/src/vfssystem.c b/os/vfs/src/vfssystem.c
index a765328c6..739de8d60 100644
--- a/os/vfs/src/vfssystem.c
+++ b/os/vfs/src/vfssystem.c
@@ -33,9 +33,6 @@
/* Module local definitions. */
/*===========================================================================*/
-#define BREAK_ON_ERROR(err) \
- if ((err) < VFS_RET_SUCCESS) break
-
/*===========================================================================*/
/* Module exported variables. */
/*===========================================================================*/
@@ -57,60 +54,17 @@ vfs_system_t vfs;
/* Module local functions. */
/*===========================================================================*/
-vfserr_t vfs_match_separator(const char **pathp) {
- vfserr_t err;
- const char *p = *pathp;
-
- if (*p++ != '/') {
- err = VFS_RET_INVALID_PATH;
- }
- else {
- err = VFS_RET_SUCCESS;
- *pathp = p;
- }
-
- return err;
-}
-
-
-vfserr_t vfs_match_filename(const char **pathp, char *fname) {
- vfserr_t err;
- size_t n;
- const char *p = *pathp;
-
- n = 0U;
- while (true) {
- char c = *p++;
- if ((c == '\0') || (c == '/')) {
- *pathp = p;
- *fname = '\0';
- err = VFS_RET_SUCCESS;
- break;
- }
-
- if (n > VFS_CFG_MAX_NAMELEN) {
- err = VFS_RET_INVALID_PATH;
- break;
- }
-
- *fname++ = c;
- n++;
- }
-
- return err;
-}
-
-vfserr_t vfs_match_driver(const char **pathp, vfs_driver_t **vdpp) {
+msg_t match_driver(const char **pathp, vfs_driver_t **vdpp) {
char fname[VFS_CFG_MAX_NAMELEN + 1];
- vfserr_t err;
+ msg_t err;
vfs_driver_t **pp;
do {
- err = vfs_match_separator(pathp);
- BREAK_ON_ERROR(err);
+ err = vfs_parse_separator(pathp);
+ VFS_BREAK_ON_ERROR(err);
- err = vfs_match_filename(pathp, fname);
- BREAK_ON_ERROR(err);
+ err = vfs_parse_filename(pathp, fname);
+ VFS_BREAK_ON_ERROR(err);
/* Searching among registered drivers.*/
pp = &vfs.drivers[0];
@@ -154,9 +108,11 @@ void vfsInit(void) {
*
* @param[in] vdp pointer to a @p vfs_driver_t structure
* @return The operation result.
+ *
+ * @api
*/
-vfserr_t vfsRegisterDriver(vfs_driver_t *vdp) {
- vfserr_t err;
+msg_t vfsRegisterDriver(vfs_driver_t *vdp) {
+ msg_t err;
VFS_LOCK();
@@ -180,14 +136,16 @@ vfserr_t vfsRegisterDriver(vfs_driver_t *vdp) {
* @param[out] vdnpp pointer to the pointer to the instantiated
* @p vfs_directory_node_t object
* @return The operation result.
+ *
+ * @api
*/
-vfserr_t vfsOpenDirectory(const char *path, vfs_directory_node_t **vdnpp) {
- vfserr_t err;
+msg_t vfsOpenDirectory(const char *path, vfs_directory_node_t **vdnpp) {
+ msg_t err;
vfs_driver_t *dp;
do {
- err = vfs_match_driver(&path, &dp);
- BREAK_ON_ERROR(err);
+ err = match_driver(&path, &dp);
+ VFS_BREAK_ON_ERROR(err);
err = dp->vmt->open_dir(path, vdnpp);
}
@@ -201,22 +159,40 @@ vfserr_t vfsOpenDirectory(const char *path, vfs_directory_node_t **vdnpp) {
*
* @param[in] vdnp the pointer to the @p vfs_directory_node_t object
* to be released
+ *
+ * @api
*/
void vfsCloseDirectory(vfs_directory_node_t *vdnp) {
vdnp->vmt->release((void *)vdnp);
}
-vfserr_t vfsGetDirectoryFirst(vfs_directory_node_t *vdnp) {
- vfserr_t err = VFS_RET_EOF;
+/**
+ * @brief First directory entry.
+ *
+ * @param[in] vdnp the pointer to the @p vfs_directory_node_t object
+ * @return The operation result.
+ *
+ * @api
+ */
+msg_t vfsGetDirectoryFirst(vfs_directory_node_t *vdnp) {
+ msg_t err = VFS_RET_EOF;
(void)vdnp;
return err;
}
-vfserr_t vfsGetDirectoryNext(vfs_directory_node_t *vdnp) {
- vfserr_t err = VFS_RET_EOF;
+/**
+ * @brief Next directory entry.
+ *
+ * @param[in] vdnp the pointer to the @p vfs_directory_node_t object
+ * @return The operation result.
+ *
+ * @api
+ */
+msg_t vfsGetDirectoryNext(vfs_directory_node_t *vdnp) {
+ msg_t err = VFS_RET_EOF;
(void)vdnp;
@@ -230,14 +206,16 @@ vfserr_t vfsGetDirectoryNext(vfs_directory_node_t *vdnp) {
* @param[out] vdnpp pointer to the pointer to the instantiated
* @p vfs_file_node_t object
* @return The operation result.
+ *
+ * @api
*/
-vfserr_t vfsOpenFile(const char *path, vfs_file_node_t **vfnpp) {
- vfserr_t err;
+msg_t vfsOpenFile(const char *path, vfs_file_node_t **vfnpp) {
+ msg_t err;
vfs_driver_t *dp;
do {
- err = vfs_match_driver(&path, &dp);
- BREAK_ON_ERROR(err);
+ err = match_driver(&path, &dp);
+ VFS_BREAK_ON_ERROR(err);
err = dp->vmt->open_file(path, vfnpp);
}
@@ -251,6 +229,8 @@ vfserr_t vfsOpenFile(const char *path, vfs_file_node_t **vfnpp) {
*
* @param[in] vfnp the pointer to the @p vfs_file_node_t object
* to be released
+ *
+ * @api
*/
void vfsCloseFile(vfs_file_node_t *vfnp) {
@@ -268,8 +248,8 @@ void vfsCloseFile(vfs_file_node_t *vfnp) {
*
* @api
*/
-vfserr_t vfsReadFile(vfs_file_node_t *vfnp, char *buf, size_t n) {
- vfserr_t err = VFS_RET_SUCCESS;
+msg_t vfsReadFile(vfs_file_node_t *vfnp, uint8_t *buf, size_t n) {
+ msg_t err = VFS_RET_SUCCESS;
(void)vfnp;
(void)buf;
@@ -289,8 +269,8 @@ vfserr_t vfsReadFile(vfs_file_node_t *vfnp, char *buf, size_t n) {
*
* @api
*/
-vfserr_t vfsWriteFile(vfs_file_node_t *vfnp, const char *buf, size_t n) {
- vfserr_t err = VFS_RET_SUCCESS;
+msg_t vfsWriteFile(vfs_file_node_t *vfnp, const uint8_t *buf, size_t n) {
+ msg_t err = VFS_RET_SUCCESS;
(void)vfnp;
(void)buf;
@@ -308,8 +288,8 @@ vfserr_t vfsWriteFile(vfs_file_node_t *vfnp, const char *buf, size_t n) {
*
* @api
*/
-vfserr_t vfsSetFilePosition(vfs_file_node_t *vfnp, vfs_offset_t offset) {
- vfserr_t err = VFS_RET_SUCCESS;
+msg_t vfsSetFilePosition(vfs_file_node_t *vfnp, vfs_offset_t offset) {
+ msg_t err = VFS_RET_SUCCESS;
(void)vfnp;
(void)offset;
diff --git a/os/vfs/vfs.mk b/os/vfs/vfs.mk
index 2bdd483ee..4c06fa0cf 100644
--- a/os/vfs/vfs.mk
+++ b/os/vfs/vfs.mk
@@ -1,5 +1,6 @@
# List of all the ChibiOS/VFS files.
-VFSSRC := $(CHIBIOS)/os/vfs/src/vfssystem.c
+VFSSRC := $(CHIBIOS)/os/vfs/src/vfsparser.c \
+ $(CHIBIOS)/os/vfs/src/vfssystem.c
# Required include directories
VFSINC := $(CHIBIOS)/os/vfs/include