diff --git a/os/vfs/drivers/fatfs/drvfatfs.c b/os/vfs/drivers/fatfs/drvfatfs.c index 7f48792e0..959181681 100644 --- a/os/vfs/drivers/fatfs/drvfatfs.c +++ b/os/vfs/drivers/fatfs/drvfatfs.c @@ -157,9 +157,11 @@ static msg_t translate_error(FRESULT res) { break; case FR_NO_FILE: case FR_NO_PATH: - case FR_INVALID_NAME: msg = VFS_RET_ENOENT; break; + case FR_INVALID_NAME: + msg = VFS_RET_ENAMETOOLONG; + break; case FR_DENIED: case FR_WRITE_PROTECTED: msg = VFS_RET_EACCES; diff --git a/os/vfs/drivers/overlay/drvoverlay.c b/os/vfs/drivers/overlay/drvoverlay.c index 03169b369..4f96de2b0 100644 --- a/os/vfs/drivers/overlay/drvoverlay.c +++ b/os/vfs/drivers/overlay/drvoverlay.c @@ -94,7 +94,7 @@ static msg_t match_driver(vfs_overlay_driver_c *odp, vfs_driver_c **pp; do { - err = vfs_parse_filename(pathp, fname); + err = vfs_parse_get_fname(pathp, fname); VFS_BREAK_ON_ERROR(err); /* Searching among registered drivers.*/ diff --git a/os/vfs/drivers/streams/drvstreams.c b/os/vfs/drivers/streams/drvstreams.c index 939bf1240..a8045d9a8 100644 --- a/os/vfs/drivers/streams/drvstreams.c +++ b/os/vfs/drivers/streams/drvstreams.c @@ -162,7 +162,7 @@ static msg_t drv_open_file(void *instance, err = vfs_parse_match_separator(&path); VFS_BREAK_ON_ERROR(err); - err = vfs_parse_filename(&path, fname); + err = vfs_parse_get_fname(&path, fname); VFS_BREAK_ON_ERROR(err); err = vfs_parse_match_end(&path); diff --git a/os/vfs/include/vfserrors.h b/os/vfs/include/vfserrors.h index 9cd298967..793b4b552 100644 --- a/os/vfs/include/vfserrors.h +++ b/os/vfs/include/vfserrors.h @@ -73,6 +73,7 @@ #define VFS_RET_ENOSPC (-32 - ENOSPC) /* No space left on device */ #define VFS_RET_ESPIPE (-32 - ESPIPE) /* Illegal seek */ #define VFS_RET_EROFS (-32 - EROFS) /* Read-only file system */ +#define VFS_RET_ENAMETOOLONG (-32 - ENAMETOOLONG)/* File or path name too long */ /** @} */ /*===========================================================================*/ diff --git a/os/vfs/include/vfsparser.h b/os/vfs/include/vfsparser.h index af9371a5f..0ed2b8235 100644 --- a/os/vfs/include/vfsparser.h +++ b/os/vfs/include/vfsparser.h @@ -57,7 +57,8 @@ extern "C" { #endif msg_t vfs_parse_match_separator(const char **pathp); msg_t vfs_parse_match_end(const char **pathp); - msg_t vfs_parse_filename(const char **pathp, char *fname); + msg_t vfs_parse_get_fname(const char **pathp, char *fname); + msg_t vfs_parse_copy_with_separator(char *dst, const char *src); #ifdef __cplusplus } #endif diff --git a/os/vfs/src/vfsparser.c b/os/vfs/src/vfsparser.c index 947e46a81..3d93517d2 100644 --- a/os/vfs/src/vfsparser.c +++ b/os/vfs/src/vfsparser.c @@ -90,13 +90,13 @@ msg_t vfs_parse_match_end(const char **pathp) { } /** - * @brief Parses a path element using the restricted Posix set. + * @brief Fetches the next path element. * @note Consumes the next path separator, if any. * * @param[in, out] pathp pointer to the path under parsing * @param[out] fname extracted file name */ -msg_t vfs_parse_filename(const char **pathp, char *fname) { +msg_t vfs_parse_get_fname(const char **pathp, char *fname) { size_t size; const char *p; @@ -136,4 +136,35 @@ msg_t vfs_parse_filename(const char **pathp, char *fname) { } } +msg_t vfs_parse_copy_with_separator(char *dst, const char *src) { + size_t n = 0U; + char lc = '\0'; + + /* Copying the path.*/ + while ((*dst = *src) != '\0') { + + if (n > VFS_CFG_PATHLEN_MAX) { + return VFS_RET_ENAMETOOLONG; + } + + lc = *src++; + dst++; + n++; + } + + /* Checking if it is terminated by a separator, if not then adding it.*/ + if (lc != '/') { + + if (n > VFS_CFG_PATHLEN_MAX) { + return VFS_RET_ENAMETOOLONG; + } + + *dst++ = '/'; + *dst = '\0'; + n++; + } + + return (msg_t)n; +} + /** @} */