git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15153 27425a3e-05d8-49a3-a47f-9c15f0e5edd8

This commit is contained in:
Giovanni Di Sirio 2021-11-29 13:54:15 +00:00
parent 80ff5d0766
commit ab568fd909
3 changed files with 35 additions and 15 deletions

View File

@ -229,8 +229,9 @@ int main(void) {
sdStart(&PORTAB_SD1, NULL); sdStart(&PORTAB_SD1, NULL);
nullObjectInit(&nullstream); nullObjectInit(&nullstream);
/* Initializing an overlay VFS object as a root, no need for a name.*/ /* Initializing an overlay VFS object as a root, bo overlaid driver,
drvOverlayObjectInit(&vfs_root, ""); no need for a name.*/
drvOverlayObjectInit(&vfs_root, NULL, "");
/* Registering a streams VFS driver on the VFS overlay root as "/dev".*/ /* Registering a streams VFS driver on the VFS overlay root as "/dev".*/
msg = drvOverlayRegisterDriver(&vfs_root, msg = drvOverlayRegisterDriver(&vfs_root,

View File

@ -104,13 +104,14 @@ static msg_t drv_open_dir(void *instance,
const char *path, const char *path,
vfs_directory_node_t **vdnpp) { vfs_directory_node_t **vdnpp) {
vfs_overlay_driver_t *drvp = (vfs_overlay_driver_t *)instance; vfs_overlay_driver_t *drvp = (vfs_overlay_driver_t *)instance;
const char *scanpath = path;
msg_t err; msg_t err;
do { do {
err = vfs_parse_match_separator(&path); err = vfs_parse_match_separator(&scanpath);
VFS_BREAK_ON_ERROR(err); VFS_BREAK_ON_ERROR(err);
if (*path == '\0') { if (*scanpath == '\0') {
/* Creating a root directory node.*/ /* Creating a root directory node.*/
vfs_overlay_dir_node_t *onp = chPoolAlloc(&drvp->dir_nodes_pool); vfs_overlay_dir_node_t *onp = chPoolAlloc(&drvp->dir_nodes_pool);
@ -129,11 +130,23 @@ static msg_t drv_open_dir(void *instance,
else { else {
vfs_driver_t *dp; vfs_driver_t *dp;
/* 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.*/ /* Delegating node creation to a registered driver.*/
err = match_driver(drvp, &path, &dp); err = dp->vmt->open_dir((void *)dp,
VFS_BREAK_ON_ERROR(err); scanpath,
vdnpp);
err = dp->vmt->open_dir((void *)dp, path, 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); while (false);
@ -216,16 +229,19 @@ static msg_t node_dir_next(void *instance, vfs_node_info_t *nip) {
* @brief VFS overlay object initialization. * @brief VFS overlay object initialization.
* *
* @param[out] vodp pointer to a @p vfs_overlay_driver_t structure * @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 * @param[in] rootname name to be attributed to this object
* @return A pointer to this initialized object. * @return A pointer to this initialized object.
* *
* @api * @api
*/ */
vfs_driver_t *drvOverlayObjectInit(vfs_overlay_driver_t *vodp, vfs_driver_t *drvOverlayObjectInit(vfs_overlay_driver_t *vodp,
vfs_driver_t *overlaid_drv,
const char *rootname) { const char *rootname) {
vodp->vmt = &driver_vmt; vodp->vmt = &driver_vmt;
vodp->rootname = rootname; vodp->rootname = rootname;
vodp->overlaid_drv = overlaid_drv;
vodp->next_driver = &vodp->drivers[0]; vodp->next_driver = &vodp->drivers[0];
/* Initializing pools.*/ /* Initializing pools.*/

View File

@ -105,6 +105,8 @@ typedef struct vfs_overlay_dir_node {
__vfs_driver_data \ __vfs_driver_data \
/* Pool of directory nodes.*/ \ /* Pool of directory nodes.*/ \
memory_pool_t dir_nodes_pool; \ memory_pool_t dir_nodes_pool; \
/* Driver to be overlaid or NULL.*/ \
vfs_driver_t *overlaid_drv; \
/* Static storage of directory nodes.*/ \ /* Static storage of directory nodes.*/ \
vfs_overlay_dir_node_t dir_nodes[DRV_CFG_OVERLAY_DIR_NODES_NUM]; \ vfs_overlay_dir_node_t dir_nodes[DRV_CFG_OVERLAY_DIR_NODES_NUM]; \
/* Next registration slot.*/ \ /* Next registration slot.*/ \
@ -142,6 +144,7 @@ typedef struct vfs_drv_overlay {
extern "C" { extern "C" {
#endif #endif
vfs_driver_t *drvOverlayObjectInit(vfs_overlay_driver_t *vodp, vfs_driver_t *drvOverlayObjectInit(vfs_overlay_driver_t *vodp,
vfs_driver_t *overlaid_drv,
const char *rootname); const char *rootname);
msg_t drvOverlayRegisterDriver(vfs_overlay_driver_t *vodp, msg_t drvOverlayRegisterDriver(vfs_overlay_driver_t *vodp,
vfs_driver_t *vdp); vfs_driver_t *vdp);