From 5fb07e89b49842fdd4b8a56469e676d716396b48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= <joakim.nohlgard@eistec.se> Date: Wed, 21 Feb 2018 09:29:51 +0100 Subject: [PATCH] pkg/fatfs: refactor absolute path handling --- pkg/fatfs/fatfs_vfs/fatfs_vfs.c | 48 +++++++++++++++++---------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/pkg/fatfs/fatfs_vfs/fatfs_vfs.c b/pkg/fatfs/fatfs_vfs/fatfs_vfs.c index 4f49d3c43f..5234fc1563 100644 --- a/pkg/fatfs/fatfs_vfs/fatfs_vfs.c +++ b/pkg/fatfs/fatfs_vfs/fatfs_vfs.c @@ -36,6 +36,17 @@ static int fatfs_err_to_errno(int32_t err); static void _fatfs_time_to_timespec(WORD fdate, WORD ftime, time_t *time); +/** + * @brief Concatenate drive number and path into the buffer provided by fs_desc + * + * Most FatFs library file operations need an absolute path. + */ +static void _build_abs_path(fatfs_desc_t *fs_desc, const char *name) +{ + snprintf(fs_desc->abs_path_str_buff, FATFS_MAX_ABS_PATH_SIZE, "%u:/%s", + fs_desc->vol_idx, name); +} + static int _mount(vfs_mount_t *mountp) { /* if one of the lines below fail to compile you probably need to adjust @@ -45,13 +56,12 @@ static int _mount(vfs_mount_t *mountp) fatfs_desc_t *fs_desc = (fatfs_desc_t *)mountp->private_data; - char volume_str[FATFS_MAX_VOL_STR_LEN]; - snprintf(volume_str, sizeof(volume_str), "%d:/", fs_desc->vol_idx); + _build_abs_path(fs_desc, ""); memset(&fs_desc->fat_fs, 0, sizeof(fs_desc->fat_fs)); - DEBUG("mounting file system of volume '%s'\n", volume_str); - FRESULT res = f_mount(&fs_desc->fat_fs, volume_str, 1); + DEBUG("mounting file system of volume '%s'\n", fs_desc->abs_path_str_buff); + FRESULT res = f_mount(&fs_desc->fat_fs, fs_desc->abs_path_str_buff, 1); if (res == FR_OK) { DEBUG("[OK]"); @@ -69,11 +79,10 @@ static int _umount(vfs_mount_t *mountp) DEBUG("fatfs_vfs.c: _umount: private_data = %p\n", mountp->private_data); - char volume_str[FATFS_MAX_VOL_STR_LEN]; - snprintf(volume_str, sizeof(volume_str), "%d:/", fs_desc->vol_idx); + _build_abs_path(fs_desc, ""); - DEBUG("unmounting file system of volume '%s'\n", volume_str); - FRESULT res = f_unmount(volume_str); + DEBUG("unmounting file system of volume '%s'\n", fs_desc->abs_path_str_buff); + FRESULT res = f_unmount(fs_desc->abs_path_str_buff); if (res == FR_OK) { DEBUG("[OK]"); @@ -90,8 +99,7 @@ static int _unlink(vfs_mount_t *mountp, const char *name) { fatfs_desc_t *fs_desc = (fatfs_desc_t *)mountp->private_data; - snprintf(fs_desc->abs_path_str_buff, FATFS_MAX_ABS_PATH_SIZE, "%d:/%s", - fs_desc->vol_idx, name); + _build_abs_path(fs_desc, name); return fatfs_err_to_errno(f_unlink(fs_desc->abs_path_str_buff)); } @@ -102,10 +110,9 @@ static int _rename(vfs_mount_t *mountp, const char *from_path, char fatfs_abs_path_to[FATFS_MAX_ABS_PATH_SIZE]; fatfs_desc_t *fs_desc = (fatfs_desc_t *)mountp->private_data; - snprintf(fs_desc->abs_path_str_buff, FATFS_MAX_ABS_PATH_SIZE, "%d:/%s", - fs_desc->vol_idx, from_path); + _build_abs_path(fs_desc, from_path); - snprintf(fatfs_abs_path_to, sizeof(fatfs_abs_path_to), "%d:/%s", + snprintf(fatfs_abs_path_to, sizeof(fatfs_abs_path_to), "%u:/%s", fs_desc->vol_idx, to_path); return fatfs_err_to_errno(f_rename(fs_desc->abs_path_str_buff, @@ -117,8 +124,7 @@ static int _open(vfs_file_t *filp, const char *name, int flags, mode_t mode, { fatfs_file_desc_t *fd = (fatfs_file_desc_t *)&filp->private_data.buffer[0]; fatfs_desc_t *fs_desc = (fatfs_desc_t *)filp->mp->private_data; - snprintf(fs_desc->abs_path_str_buff, FATFS_MAX_ABS_PATH_SIZE, "%d:/%s", - fs_desc->vol_idx, name); + _build_abs_path(fs_desc, name); (void) abs_path; (void) mode; /* fatfs can't use mode param with f_open*/ @@ -251,8 +257,7 @@ static int _fstat(vfs_file_t *filp, struct stat *buf) FILINFO fi; FRESULT res; - snprintf(fs_desc->abs_path_str_buff, FATFS_MAX_ABS_PATH_SIZE, "%d:/%s", - fs_desc->vol_idx, fd->fname); + _build_abs_path(fs_desc, fd->fname); memset(buf, 0, sizeof(*buf)); @@ -295,8 +300,7 @@ static int _opendir(vfs_DIR *dirp, const char *dirname, const char *abs_path) fatfs_desc_t *fs_desc = (fatfs_desc_t *)dirp->mp->private_data; (void) abs_path; - snprintf(fs_desc->abs_path_str_buff, FATFS_MAX_ABS_PATH_SIZE, "%d:/%s", - fs_desc->vol_idx, dirname); + _build_abs_path(fs_desc, dirname); return fatfs_err_to_errno(f_opendir(dir, fs_desc->abs_path_str_buff)); } @@ -334,8 +338,7 @@ static int _mkdir (vfs_mount_t *mountp, const char *name, mode_t mode) fatfs_desc_t *fs_desc = (fatfs_desc_t *)mountp->private_data; (void) mode; - snprintf(fs_desc->abs_path_str_buff, FATFS_MAX_ABS_PATH_SIZE, "%d:/%s", - fs_desc->vol_idx, name); + _build_abs_path(fs_desc, name); return fatfs_err_to_errno(f_mkdir(fs_desc->abs_path_str_buff)); } @@ -344,8 +347,7 @@ static int _rmdir (vfs_mount_t *mountp, const char *name) { fatfs_desc_t *fs_desc = (fatfs_desc_t *)mountp->private_data; - snprintf(fs_desc->abs_path_str_buff, FATFS_MAX_ABS_PATH_SIZE, "%d:/%s", - fs_desc->vol_idx, name); + _build_abs_path(fs_desc, name); return fatfs_err_to_errno(f_unlink(fs_desc->abs_path_str_buff)); } -- GitLab