git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15130 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
parent
fc29bee998
commit
b1abb2fc34
|
@ -35,17 +35,36 @@
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief @p vfs_drv_streams_t specific methods.
|
* @brief Number of nodes pre-allocated in the pool.
|
||||||
*/
|
*/
|
||||||
#define __vfs_drv_streams_methods \
|
#define DRV_NODES_NUM 2
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief @p vfs_streams_driver_t specific methods.
|
||||||
|
*/
|
||||||
|
#define __vfs_streams_driver_methods \
|
||||||
__vfs_driver_methods
|
__vfs_driver_methods
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief @p vfs_drv_streams_t specific data.
|
* @brief @p vfs_streams_driver_t specific data.
|
||||||
*/
|
*/
|
||||||
#define __vfs_drv_streams_data \
|
#define __vfs_streams_driver_data \
|
||||||
__vfs_driver_data \
|
__vfs_driver_data \
|
||||||
const drv_stream_element_t *streams;
|
const drv_stream_element_t *streams; \
|
||||||
|
memory_pool_t nodes_pool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief @p vfs_stream_file_node_t specific methods.
|
||||||
|
*/
|
||||||
|
#define __vfs_stream_file_node_methods \
|
||||||
|
__vfs_file_node_methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief @p vfs_stream_file_node_t specific data.
|
||||||
|
*/
|
||||||
|
#define __vfs_stream_file_node_data \
|
||||||
|
__vfs_file_node_data \
|
||||||
|
BaseSequentialStream *stream;
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Module exported variables. */
|
/* Module exported variables. */
|
||||||
|
@ -56,10 +75,10 @@
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief @p vfs_drv_streams_t virtual methods table.
|
* @brief @p vfs_streams_driver_t virtual methods table.
|
||||||
*/
|
*/
|
||||||
struct vfs_drv_streams_vmt {
|
struct vfs_streams_driver_vmt {
|
||||||
__vfs_drv_streams_methods
|
__vfs_streams_driver_methods
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -69,9 +88,27 @@ typedef struct vfs_drv_streams {
|
||||||
/**
|
/**
|
||||||
* @brief Virtual Methods Table.
|
* @brief Virtual Methods Table.
|
||||||
*/
|
*/
|
||||||
const struct vfs_drv_streams_vmt *vmt;
|
const struct vfs_streams_driver_vmt *vmt;
|
||||||
__vfs_drv_streams_data
|
__vfs_streams_driver_data
|
||||||
} vfs_drv_streams_t;
|
} vfs_streams_driver_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief @p vfs_file_node_t virtual methods table.
|
||||||
|
*/
|
||||||
|
struct vfs_stream_file_node_vmt {
|
||||||
|
__vfs_stream_file_node_methods
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Type of a structure representing a stream file VFS node.
|
||||||
|
*/
|
||||||
|
typedef struct vfs_stream_file_node {
|
||||||
|
/**
|
||||||
|
* @brief Virtual Methods Table.
|
||||||
|
*/
|
||||||
|
const struct vfs_stream_file_node_vmt *vmt;
|
||||||
|
__vfs_stream_file_node_data
|
||||||
|
} vfs_stream_file_node_t;
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Module local variables. */
|
/* Module local variables. */
|
||||||
|
@ -84,12 +121,13 @@ static msg_t drv_open_file(void *instance,
|
||||||
const char *path,
|
const char *path,
|
||||||
vfs_file_node_t **vfnpp);
|
vfs_file_node_t **vfnpp);
|
||||||
|
|
||||||
static const struct vfs_drv_streams_vmt vmt = {
|
static const struct vfs_streams_driver_vmt vmt = {
|
||||||
.open_dir = drv_open_dir,
|
.open_dir = drv_open_dir,
|
||||||
.open_file = drv_open_file
|
.open_file = drv_open_file
|
||||||
};
|
};
|
||||||
|
|
||||||
static vfs_drv_streams_t drv_streams;
|
static vfs_stream_file_node_t drv_file_nodes[DRV_NODES_NUM];
|
||||||
|
static vfs_streams_driver_t drv_streams;
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Module local functions. */
|
/* Module local functions. */
|
||||||
|
@ -109,7 +147,7 @@ static msg_t drv_open_dir(void *instance,
|
||||||
static msg_t drv_open_file(void *instance,
|
static msg_t drv_open_file(void *instance,
|
||||||
const char *path,
|
const char *path,
|
||||||
vfs_file_node_t **vfnpp) {
|
vfs_file_node_t **vfnpp) {
|
||||||
vfs_drv_streams_t *drvp = (vfs_drv_streams_t *)instance;
|
vfs_streams_driver_t *drvp = (vfs_streams_driver_t *)instance;
|
||||||
const drv_stream_element_t *dsep;
|
const drv_stream_element_t *dsep;
|
||||||
msg_t err;
|
msg_t err;
|
||||||
|
|
||||||
|
@ -125,15 +163,27 @@ static msg_t drv_open_file(void *instance,
|
||||||
err = vfs_parse_match_end(&path);
|
err = vfs_parse_match_end(&path);
|
||||||
VFS_BREAK_ON_ERROR(err);
|
VFS_BREAK_ON_ERROR(err);
|
||||||
|
|
||||||
|
|
||||||
dsep = &drvp->streams[0];
|
dsep = &drvp->streams[0];
|
||||||
while (dsep->name != NULL) {
|
while (dsep->name != NULL) {
|
||||||
if (strncmp(fname, dsep->name, VFS_CFG_MAX_NAMELEN) == 0) {
|
if (strncmp(fname, dsep->name, VFS_CFG_MAX_NAMELEN) == 0) {
|
||||||
|
vfs_stream_file_node_t *sfnp;
|
||||||
|
|
||||||
*vfnpp = NULL;
|
sfnp = chPoolAlloc(&drv_streams.nodes_pool);
|
||||||
|
if (sfnp != NULL) {
|
||||||
|
|
||||||
|
/* Node object initialization.*/
|
||||||
|
sfnp->vmt = 0;
|
||||||
|
sfnp->refs = 1U;
|
||||||
|
sfnp->driver = (vfs_driver_t *)drvp;
|
||||||
|
sfnp->stream = dsep->stream;
|
||||||
|
|
||||||
|
*vfnpp = (vfs_file_node_t *)sfnp;
|
||||||
return VFS_RET_SUCCESS;
|
return VFS_RET_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return VFS_RET_NO_RESOURCE;
|
||||||
|
}
|
||||||
|
|
||||||
dsep++;
|
dsep++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,6 +204,10 @@ vfs_driver_t *drvStreamsInit(const char *rootname,
|
||||||
drv_streams.vmt = &vmt;
|
drv_streams.vmt = &vmt;
|
||||||
drv_streams.rootname = rootname;
|
drv_streams.rootname = rootname;
|
||||||
drv_streams.streams = streams;
|
drv_streams.streams = streams;
|
||||||
|
chPoolObjectInit(&drv_streams.nodes_pool,
|
||||||
|
sizeof (vfs_stream_file_node_t),
|
||||||
|
chCoreAllocAligned);
|
||||||
|
chPoolLoadArray(&drv_streams.nodes_pool, drv_file_nodes, DRV_NODES_NUM);
|
||||||
|
|
||||||
return (vfs_driver_t *)&drv_streams;
|
return (vfs_driver_t *)&drv_streams;
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
#define VFS_RET_SUCCESS 0
|
#define VFS_RET_SUCCESS 0
|
||||||
#define VFS_RET_TIMEOUT -1
|
#define VFS_RET_TIMEOUT -1
|
||||||
#define VFS_RET_EOF -2
|
#define VFS_RET_EOF -2
|
||||||
#define VFS_RET_PAST_LIMIT -3
|
#define VFS_RET_NO_RESOURCE -3
|
||||||
#define VFS_RET_NO_DRIVER -4
|
#define VFS_RET_NO_DRIVER -4
|
||||||
#define VFS_RET_INVALID_PATH -5
|
#define VFS_RET_INVALID_PATH -5
|
||||||
#define VFS_RET_NOT_FOUND -6
|
#define VFS_RET_NOT_FOUND -6
|
||||||
|
|
|
@ -106,7 +106,7 @@ typedef struct vfs_node vfs_node_t;
|
||||||
#define __vfs_node_data \
|
#define __vfs_node_data \
|
||||||
_base_object_data \
|
_base_object_data \
|
||||||
/* Number of references to this node.*/ \
|
/* Number of references to this node.*/ \
|
||||||
unsigned references_counter; \
|
unsigned refs; \
|
||||||
/* Driver handling this node.*/ \
|
/* Driver handling this node.*/ \
|
||||||
vfs_driver_t *driver;
|
vfs_driver_t *driver;
|
||||||
|
|
||||||
|
|
|
@ -106,21 +106,14 @@ msg_t vfs_parse_filename(const char **pathp, char *fname) {
|
||||||
|
|
||||||
n = 0U;
|
n = 0U;
|
||||||
while (true) {
|
while (true) {
|
||||||
char c = *p++;
|
char c = *p;
|
||||||
|
|
||||||
/* Valid characters for path names.*/
|
/* Valid characters for path names.*/
|
||||||
if (!isalnum(c) && (c != '_') && (c != '-') && (c != '.')) {
|
if (!isalnum(c) && (c != '_') && (c != '-') && (c != '.')) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c == '/') {
|
if ((c == '/') || (c == '\0')) {
|
||||||
*pathp = p + 1;
|
|
||||||
*fname = '\0';
|
|
||||||
err = VFS_RET_SUCCESS;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c == '\0') {
|
|
||||||
*pathp = p;
|
*pathp = p;
|
||||||
*fname = '\0';
|
*fname = '\0';
|
||||||
err = VFS_RET_SUCCESS;
|
err = VFS_RET_SUCCESS;
|
||||||
|
@ -132,6 +125,7 @@ msg_t vfs_parse_filename(const char **pathp, char *fname) {
|
||||||
}
|
}
|
||||||
|
|
||||||
*fname++ = c;
|
*fname++ = c;
|
||||||
|
p++;
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,7 @@ msg_t vfsRegisterDriver(vfs_driver_t *vdp) {
|
||||||
VFS_LOCK();
|
VFS_LOCK();
|
||||||
|
|
||||||
if (vfs.next_driver >= &vfs.drivers[VFS_CFG_MAX_DRIVERS]) {
|
if (vfs.next_driver >= &vfs.drivers[VFS_CFG_MAX_DRIVERS]) {
|
||||||
err = VFS_RET_PAST_LIMIT;
|
err = VFS_RET_NO_RESOURCE;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
*vfs.next_driver++ = vdp;
|
*vfs.next_driver++ = vdp;
|
||||||
|
|
Loading…
Reference in New Issue