From ab568fd909943c43fb469b2c81f4447ea2141430 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Mon, 29 Nov 2021 13:54:15 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15153 27425a3e-05d8-49a3-a47f-9c15f0e5edd8 --- demos/STM32/RT-VFS-FATFS/main.c | 5 ++-- os/vfs/drivers/overlay/drvoverlay.c | 42 ++++++++++++++++++++--------- os/vfs/drivers/overlay/drvoverlay.h | 3 +++ 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/demos/STM32/RT-VFS-FATFS/main.c b/demos/STM32/RT-VFS-FATFS/main.c index c7cfe28c5..4fd94b28e 100644 --- a/demos/STM32/RT-VFS-FATFS/main.c +++ b/demos/STM32/RT-VFS-FATFS/main.c @@ -229,8 +229,9 @@ int main(void) { sdStart(&PORTAB_SD1, NULL); nullObjectInit(&nullstream); - /* Initializing an overlay VFS object as a root, no need for a name.*/ - drvOverlayObjectInit(&vfs_root, ""); + /* Initializing an overlay VFS object as a root, bo overlaid driver, + no need for a name.*/ + drvOverlayObjectInit(&vfs_root, NULL, ""); /* Registering a streams VFS driver on the VFS overlay root as "/dev".*/ msg = drvOverlayRegisterDriver(&vfs_root, diff --git a/os/vfs/drivers/overlay/drvoverlay.c b/os/vfs/drivers/overlay/drvoverlay.c index 0ffc95977..56da21a14 100644 --- a/os/vfs/drivers/overlay/drvoverlay.c +++ b/os/vfs/drivers/overlay/drvoverlay.c @@ -104,13 +104,14 @@ static msg_t drv_open_dir(void *instance, const char *path, vfs_directory_node_t **vdnpp) { vfs_overlay_driver_t *drvp = (vfs_overlay_driver_t *)instance; + const char *scanpath = path; msg_t err; do { - err = vfs_parse_match_separator(&path); + err = vfs_parse_match_separator(&scanpath); VFS_BREAK_ON_ERROR(err); - if (*path == '\0') { + if (*scanpath == '\0') { /* Creating a root directory node.*/ vfs_overlay_dir_node_t *onp = chPoolAlloc(&drvp->dir_nodes_pool); @@ -129,11 +130,23 @@ static msg_t drv_open_dir(void *instance, else { vfs_driver_t *dp; - /* Delegating node creation to a registered driver.*/ - err = match_driver(drvp, &path, &dp); - VFS_BREAK_ON_ERROR(err); - - err = dp->vmt->open_dir((void *)dp, path, vdnpp); + /* Searching for a match among registered overlays.*/ + err = match_driver(drvp, &scanpath, &dp); + if (err == VFS_RET_SUCCESS) { + /* Delegating node creation to a registered driver.*/ + err = dp->vmt->open_dir((void *)dp, + scanpath, + vdnpp); + } + else { + /* No matching overlay, the whole path is passed to the overlaid + driver, if defined, else returning the previous error.*/ + if (drvp->overlaid_drv != NULL) { + err = drvp->overlaid_drv->vmt->open_dir((void *)drvp->overlaid_drv, + path, + vdnpp); + } + } } } while (false); @@ -215,18 +228,21 @@ static msg_t node_dir_next(void *instance, vfs_node_info_t *nip) { /** * @brief VFS overlay object initialization. * - * @param[out] vodp pointer to a @p vfs_overlay_driver_t structure - * @param[in] rootname name to be attributed to this object - * @return A pointer to this initialized object. + * @param[out] vodp pointer to a @p vfs_overlay_driver_t structure + * @param[out] overlaid_drv pointer to a driver to be overlaid + * @param[in] rootname name to be attributed to this object + * @return A pointer to this initialized object. * * @api */ vfs_driver_t *drvOverlayObjectInit(vfs_overlay_driver_t *vodp, + vfs_driver_t *overlaid_drv, const char *rootname) { - vodp->vmt = &driver_vmt; - vodp->rootname = rootname; - vodp->next_driver = &vodp->drivers[0]; + vodp->vmt = &driver_vmt; + vodp->rootname = rootname; + vodp->overlaid_drv = overlaid_drv; + vodp->next_driver = &vodp->drivers[0]; /* Initializing pools.*/ chPoolObjectInit(&vodp->dir_nodes_pool, diff --git a/os/vfs/drivers/overlay/drvoverlay.h b/os/vfs/drivers/overlay/drvoverlay.h index 9d4caa65c..a129df8b5 100644 --- a/os/vfs/drivers/overlay/drvoverlay.h +++ b/os/vfs/drivers/overlay/drvoverlay.h @@ -105,6 +105,8 @@ typedef struct vfs_overlay_dir_node { __vfs_driver_data \ /* Pool of directory nodes.*/ \ memory_pool_t dir_nodes_pool; \ + /* Driver to be overlaid or NULL.*/ \ + vfs_driver_t *overlaid_drv; \ /* Static storage of directory nodes.*/ \ vfs_overlay_dir_node_t dir_nodes[DRV_CFG_OVERLAY_DIR_NODES_NUM]; \ /* Next registration slot.*/ \ @@ -142,6 +144,7 @@ typedef struct vfs_drv_overlay { extern "C" { #endif vfs_driver_t *drvOverlayObjectInit(vfs_overlay_driver_t *vodp, + vfs_driver_t *overlaid_drv, const char *rootname); msg_t drvOverlayRegisterDriver(vfs_overlay_driver_t *vodp, vfs_driver_t *vdp);