extmod/vfs: Add ability for VFS sub-system to import using VfsFat.

This commit is contained in:
Damien George 2017-01-27 17:17:54 +11:00
parent fb3ae1784e
commit 6c23c7587f
4 changed files with 15 additions and 10 deletions

View File

@ -31,6 +31,7 @@
#include "py/objstr.h" #include "py/objstr.h"
#include "py/mperrno.h" #include "py/mperrno.h"
#include "extmod/vfs.h" #include "extmod/vfs.h"
#include "extmod/vfs_fat.h"
#if MICROPY_VFS #if MICROPY_VFS
@ -114,6 +115,12 @@ mp_import_stat_t mp_vfs_import_stat(const char *path) {
if (vfs == VFS_NONE || vfs == VFS_ROOT) { if (vfs == VFS_NONE || vfs == VFS_ROOT) {
return MP_IMPORT_STAT_NO_EXIST; return MP_IMPORT_STAT_NO_EXIST;
} }
#if MICROPY_VFS_FAT
// fast paths for known VFS types
if (mp_obj_get_type(vfs->obj) == &mp_fat_vfs_type) {
return fat_vfs_import_stat(MP_OBJ_TO_PTR(vfs->obj), path_out);
}
#endif
// TODO delegate to vfs.stat() method // TODO delegate to vfs.stat() method
return MP_IMPORT_STAT_NO_EXIST; return MP_IMPORT_STAT_NO_EXIST;
} }

View File

@ -24,6 +24,8 @@
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#include "py/lexer.h"
struct _fs_user_mount_t; struct _fs_user_mount_t;
extern const byte fresult_to_errno_table[20]; extern const byte fresult_to_errno_table[20];
@ -31,6 +33,7 @@ extern const mp_obj_type_t mp_fat_vfs_type;
struct _fs_user_mount_t *ff_get_vfs(const char **path); struct _fs_user_mount_t *ff_get_vfs(const char **path);
mp_import_stat_t fat_vfs_import_stat(struct _fs_user_mount_t *vfs, const char *path);
mp_obj_t fatfs_builtin_open(mp_uint_t n_args, const mp_obj_t *args, mp_map_t *kwargs); mp_obj_t fatfs_builtin_open(mp_uint_t n_args, const mp_obj_t *args, mp_map_t *kwargs);
mp_obj_t fatfs_builtin_open_self(mp_obj_t self_in, mp_obj_t path, mp_obj_t mode); mp_obj_t fatfs_builtin_open_self(mp_obj_t self_in, mp_obj_t path, mp_obj_t mode);
MP_DECLARE_CONST_FUN_OBJ_KW(mp_builtin_open_obj); MP_DECLARE_CONST_FUN_OBJ_KW(mp_builtin_open_obj);

View File

@ -108,21 +108,17 @@ mp_obj_t fat_vfs_listdir2(fs_user_mount_t *vfs, const char *path, bool is_str_ty
return dir_list; return dir_list;
} }
mp_import_stat_t fat_vfs_import_stat(const char *path); mp_import_stat_t fat_vfs_import_stat(fs_user_mount_t *vfs, const char *path) {
mp_import_stat_t fat_vfs_import_stat(const char *path) {
FILINFO fno; FILINFO fno;
#if !MICROPY_FATFS_OO && _USE_LFN #if !MICROPY_FATFS_OO && _USE_LFN
fno.lfname = NULL; fno.lfname = NULL;
fno.lfsize = 0; fno.lfsize = 0;
#endif #endif
#if MICROPY_FATFS_OO #if MICROPY_FATFS_OO
fs_user_mount_t *vfs = ff_get_vfs(&path); assert(vfs != NULL);
if (vfs == NULL) {
return MP_IMPORT_STAT_NO_EXIST;
}
FRESULT res = f_stat(&vfs->fatfs, path, &fno); FRESULT res = f_stat(&vfs->fatfs, path, &fno);
#else #else
(void)vfs;
FRESULT res = f_stat(path, &fno); FRESULT res = f_stat(path, &fno);
#endif #endif
if (res == FR_OK) { if (res == FR_OK) {

View File

@ -28,9 +28,8 @@
#include "py/lexer.h" #include "py/lexer.h"
#include "lib/fatfs/ff.h" #include "lib/fatfs/ff.h"
#include "extmod/vfs_fat.h"
mp_import_stat_t fat_vfs_import_stat(const char *path);
mp_import_stat_t mp_import_stat(const char *path) { mp_import_stat_t mp_import_stat(const char *path) {
return fat_vfs_import_stat(path); return fat_vfs_import_stat(NULL, path);
} }